Domanda

Ho un po 'di codice Python che funziona correttamente quando uso python.exe per eseguirlo, ma fallisco se uso 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()

Il messaggio che ricevo è:

    Exception thrown: [Error 6] The handle is invalid

Tuttavia, se non specifico il parametro 'stdout', subprocess.call () inizia bene.

Vedo che pythonw.exe potrebbe reindirizzare l'output stesso, ma non riesco a capire perché mi viene impedito di specificare stdout per un nuovo thread.

È stato utile?

Soluzione

Gli handle

sys.stdin e sys.stdout non sono validi perché pythonw non fornisce supporto alla console in quanto viene eseguito come un demone, quindi gli argomenti predefiniti del sottoprocesso . call () non riesce.

I programmi Deamon chiudono di proposito stdin / stdout / stderr e usano invece il logging, quindi devi gestirlo tu stesso: suggerirei di usare subprocess.PIPE.

Se davvero non ti interessa cosa dicono gli errori del processo secondario, puoi usare os.devnull (non sono sicuro di quanto sia portatile lo è?) ma non lo consiglierei.

Altri suggerimenti

Per la cronaca, il mio codice ora è simile al seguente:

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())

Si noti che, a causa di un apparente bug nel modulo di sottoprocesso, la chiamata a Popen () deve specificare anche una pipe per stdin, che chiudiamo immediatamente dopo.

Questa è una vecchia domanda, ma lo stesso problema si è verificato anche con pyInstaller.

In verità, ciò accadrà con qualsiasi framework che converte il codice in Python per exe senza console.

Nei miei test, ho osservato che se uso il flag " console = True " nel mio file di specifiche (pyInstaller) l'errore non si verifica più. .

La soluzione è stata seguire la punta di Piotr Lesnicki.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top