subproceso. Comportamiento abierto después de cx_freeze

Tengo algo de código python utilizando subprocess.Popen para abrir una aplicación de consola y obtener stdout / stderr de ella.

El lanzamiento desde el intérprete funciona bien y según lo previsto.

Después de usar cx_freeze con la --base-name Win32GUI , Popen aparece en una ventana de consola ahora y no puedo capturar stdout / stderr. Si --base-name Win32GUI , funciona como estaba previsto, pero ahora tengo una consola detrás de la interfaz de usuario.

Aquí está el código (lo he intentado sin startupinfo y sin shell=False ):

 startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW startupinfo.wShowWindow = subprocess.SW_HIDE subprocess.Popen(['exe', 'arg1', 'arg2'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, startupinfo=startupinfo) 

Estoy usando out, err = p.communicate() para capturar stdout / stderr

Está bien, he encontrado una solución. Parece que, dado que no se trata de una aplicación de GUI de Windows, el controlador de stdout no existe y parece que el subproceso hereda ese comportamiento. Por lo tanto, una solución es una simple y una más complicada involucrada con el win32api y creando un conducto para él (no probé este método).

Esto es lo que finalmente funcionó:

 startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW startupinfo.wShowWindow = subprocess.SW_HIDE stdout_file = tempfile.NamedTemporaryFile(mode='r+', delete=False) process = subprocess.Popen(['exe', 'arg1', 'arg2'], stdin=subprocess.PIPE, stdout=stdout_file, stderr=subprocess.PIPE, shell=False, startupinfo=startupinfo) return_code = process.wait() stdout_file.flush() stdout_file.seek(0) # This is required to reset position to the start of the file out = stdout_file.read() stdout_file.close()