subprocess multi-plataforma com janela escondida
-
06-07-2019 - |
Pergunta
Eu quero abrir um processo em segundo plano e interagir com ele, mas este processo deve ser invisível em Linux e Windows. No Windows você tem que fazer algumas coisas com STARTUPINFO, enquanto isso não é válida em Linux:
ValueError: STARTUPINFO só é suportado em plataformas Windows
Existe uma maneira mais simples de criar um comando Popen separada para cada sistema operacional?
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)
Solução
Você pode reduzir uma linha:)
startupinfo = None
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(command, startupinfo=startupinfo)
Outras dicas
Apenas uma nota:. Para Python 2.7 eu tenho que usar subprocess._subprocess.STARTF_USESHOWWINDOW
vez de subprocess.STARTF_USESHOWWINDOW
Eu não tenho certeza que você pode obter muito mais simples do que você fez. Você está falando sobre como otimizar a talvez 5 linhas de código. Para o dinheiro que eu só iria continuar com meu projeto e aceitar isso como um consquence de desenvolvimento multi-plataforma. Se você fazê-lo muito, então, criar uma classe ou função especializada para encapsular a lógica e importá-lo.
Você pode transformar seu código em:
params = dict()
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
params['startupinfo'] = startupinfo
proc = subprocess.Popen(command, **params)
mas isso não é muito melhor.