Кроссплатформенный подпроцесс со скрытым окном - PullRequest
36 голосов
/ 19 июня 2009

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

ValueError: startupinfo поддерживается только на платформах Windows

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

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)    

Ответы [ 4 ]

36 голосов
/ 19 июня 2009

Вы можете уменьшить одну строку:)

startupinfo = None
if os.name == 'nt':
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(command, startupinfo=startupinfo)
12 голосов
/ 09 августа 2010

Только примечание: для Python 2.7 Я должен использовать subprocess._subprocess.STARTF_USESHOWWINDOW вместо subprocess.STARTF_USESHOWWINDOW.

4 голосов
/ 19 июня 2009

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

1 голос
/ 19 июня 2009

Вы можете превратить свой код в:

params = dict()

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...