Pregunta

Tengo un código de Python que funciona correctamente cuando uso python.exe para ejecutarlo, pero falla si 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()

El mensaje que recibo es:

    Exception thrown: [Error 6] The handle is invalid

Sin embargo, si no especifico el parámetro 'stdout', subprocess.call () comienza bien.

Puedo ver que pythonw.exe podría estar redirigiendo la salida, pero no puedo ver por qué no puedo especificar stdout para un nuevo hilo.

¿Fue útil?

Solución

Los controladores

sys.stdin y sys.stdout no son válidos porque pythonw no proporciona soporte de consola ya que se ejecuta como un demonio, por lo que los argumentos predeterminados del subproceso . call () están fallando.

Los programas de Deamon cierran stdin / stdout / stderr a propósito y utilizan el registro en su lugar, por lo que debe administrarlo usted mismo: sugeriría usar subprocess.PIPE.

Si realmente no le importa lo que el subproceso dice sobre errores y todo, podría usar os.devnull (no estoy realmente seguro de cuán portátil lo es?) pero no lo recomendaría.

Otros consejos

Para el registro, mi código ahora se ve así:

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

Tenga en cuenta que, debido a un error aparente en el módulo de subproceso, la llamada a Popen () también debe especificar una tubería para stdin, que cerramos inmediatamente después.

Esta es una vieja pregunta, pero el mismo problema ocurrió con pyInstaller también.

En verdad, esto sucederá con cualquier marco que convierta código en python para exe sin consola.

En mis pruebas, observé que si uso el indicador " console = True " en mi archivo de especificaciones (pyInstaller) el error ya no ocurre. .

La solución fue seguir la punta de Piotr Lesnicki.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top