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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top