subprocess.call Python () falhar quando usando pythonw.exe
-
19-08-2019 - |
Pergunta
Eu tenho algum código Python que funciona corretamente quando uso python.exe para executá-lo, mas não consegue se eu usar pythonw.exe.
def runStuff(commandLine): outputFileName = 'somefile.txt' outputFile = open(outputFileName, "w") try: result = subprocess.call(commandLine, shell=True, stdout=outputFile) except: print 'Exception thrown:', str(sys.exc_info()[1]) myThread = threading.Thread(None, target=runStuff, commandLine=['whatever...']) myThread.start()
A mensagem que recebo é:
Exception thrown: [Error 6] The handle is invalid
No entanto, se eu não especificar o 'stdout' parâmetro, subprocess.call () começa bem.
Eu posso ver que pythonw.exe pode ser redirecionar a saída em si, mas eu não posso ver porque eu estou impedido de especificando stdout para um novo segmento.
Solução
sys.stdin
e sys.stdout
alças são inválidos porque pythonw não fornece suporte console como ele é executado como um daemon, então argumentos padrão de subprocess.call()
estão falhando.
programas Deamon perto stdin / stdout / stderr propositadamente e registro de uso em vez, de modo que você tem que gerenciar este você mesmo:. Gostaria de sugerir a utilização subprocess.PIPE
Se você realmente não se preocupam com o que o processo sub diz para erros e tudo, você poderia usar os.devnull
(eu não sou realmente certo como portátil é?), Mas eu não faria recomendamos que.
Outras dicas
Para o registro, o meu código agora se parece com isso:
def runStuff(commandLine):
outputFileName = 'somefile.txt'
outputFile = open(outputFileName, "w")
if guiMode:
result = subprocess.call(commandLine, shell=True, stdout=outputFile, stderr=subprocess.STDOUT)
else:
proc = subprocess.Popen(commandLine, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
proc.stdin.close()
proc.wait()
result = proc.returncode
outputFile.write(proc.stdout.read())
Note que, devido a um aparente bug no módulo subprocesso, a chamada para Popen () tem de especificar um tubo para stdin bem, que nós perto imediatamente depois.
Esta é uma questão de idade, mas o mesmo problema aconteceu com pyInstaller também.
Na verdade, isso vai acontecer com qualquer estrutura que código convertidos em python para exe sem console.
Em meus testes, observei que se eu usar o sinalizador "console = True" no meu arquivo spec (pyInstaller) o erro já não ocorre. .
A solução foi seguir a ponta de Piotr Lesnicki.