Кроссплатформенный подпроцесс со скрытым окном
-
06-07-2019 - |
Вопрос
Я хочу открыть процесс в фоновом режиме и взаимодействовать с ним, но этот процесс должен быть невидимым как в 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)
но это не намного лучше.