Вопрос по python, subprocess, linux, windows, cross-platform – Кроссплатформенный подпроцесс со скрытым окном

36

Я хочу открыть процесс в фоновом режиме и взаимодействовать с ним, но этот процесс должен быть невидимым как в Linux, так и в Windows. В Windows вам нужно что-то сделать со STARTUPINFO, хотя в Linux это недопустимо:

ValueError: startupinfo is only supported on Windows platforms

Есть ли более простой способ, чем создание отдельной команды Popen для каждой ОС?

<code>if os.name == 'nt':
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    proc = subprocess.Popen(command, startupinfo=startupinfo)
if os.name == 'posix':
    proc = subprocess.Popen(command)    
</code>

Ваш Ответ

4   ответа
35

startupinfo = None
if os.name == 'nt':
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(command, startupinfo=startupinfo)
Ага. Я пробовал startupinfo = & apos; & apos; и это не сработало. Это ответ, который я искал. endolith
Если вы установитеSTARTF_SHOWWINDOW, вы также хотите инициализироватьwShowWindow членstartupinfo к одному изSW_* константы. Этот метод основан на программе, которую вы запускаете, действуя наwShowWindow флаг; это не требуется для этого.
я просто просмотрел код подпроцесса, чтобы увидеть, как они генерируют эту ошибку, и они проверяют, не является ли startupinfo None, как это должно быть в python
1

params = dict()

if os.name == 'nt':
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    params['startupinfo'] = startupinfo

proc = subprocess.Popen(command, **params)

но это не намного лучше.

нет необходимости создавать params, так как во всех системах Popen принимает param startupinfo, но в posix оно должно быть None
12

Python 2.7 Я должен использоватьsubprocess._subprocess.STARTF_USESHOWWINDOW вместоsubprocess.STARTF_USESHOWWINDOW.

Какая версия Python 2.7 была? В соответствии сcode.google.com/p/googleappengine/issues/detail?id=10363#c2 subprocess.STARTF_USESHOWWINDOW is added after Python 2.7.2.
Спасибо, это был именно тот совет, который мне был нужен.
Связанная проблема Python 9861:subprocess module changed exposed attributes
4

что вы можете сделать это намного проще, чем то, что вы сделали. Вы говорите об оптимизации, возможно, 5 строк кода. За эти деньги я бы просто продолжил свой проект и принял это как следствие кроссплатформенной разработки. Если вы делаете это много, то создайте специализированный класс или функцию для инкапсуляции логики и импортируйте ее.

Похожие вопросы