2008-12-03 13 views
5

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

El mensaje que recibo es:

 
    Exception thrown: [Error 6] The handle is invalid 

Sin embargo, si no se especifica el parámetro 'stdout', subprocess.call() empieza bien.

Veo que pythonw.exe podría estar redireccionando la salida, pero no veo por qué estoy bloqueado para especificar stdout para un nuevo hilo.

Respuesta

7

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

Los programas de Deamon cierran stdin/stdout/stderr a propósito y usan el registro en su lugar, por lo que debe gestionarlo usted mismo: Sugeriría usar subproceso.PIPE.

Si realmente no se preocupan por lo que el proceso de sub dice de errores y todo, usted podría utilizar os.devnull (no estoy muy seguro de cómo portátil es?), Pero no lo recomendaría eso.

6

Para el registro, el 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 evidente en el módulo de subproceso, la llamada a Popen() tiene que especificar un tubo para la entrada estándar, así , que cerramos inmediatamente después.

2

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 utilizo la marca "console = True" en mi archivo spec (pyInstaller) el error ya no ocurre. .

La solución fue seguir el consejo de Piotr Lesnicki.

+0

Actualmente estoy teniendo el mismo problema, he hecho una gran aplicación con PyQt4 y no puedo obtener selenio para trabajar sin la consola. Por favor, dime cómo arreglar esto. https://stackoverflow.com/questions/46520823/selenium-dont-work-after-exporting-to-exe-in-windowed-mode-in-pyinstaller –

Cuestiones relacionadas