Вопрос

Я хочу открыть процесс в фоновом режиме и взаимодействовать с ним, но этот процесс должен быть невидимым как в 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)    
Это было полезно?

Решение

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

startupinfo = None
if os.name == 'nt':
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(command, startupinfo=startupinfo)

Другие советы

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

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

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

params = dict()

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top