2012-04-24 13 views
11

Quiero ser capaz de obtener el contenido de stdout y stderr cuando corro la siguiente secuencia de comandos en las ventanas utilizando pythonw.exe:subproceso Popen que no trabajan con pythonw.exe

import subprocess 
import sys 
import os 
import string 
import time 

tmpdir = 'c:/temp' 
cmd = 'dir c:' 

tmpfile = "tmp_%f" % (time.time()) 
tmpfile = os.path.normpath(os.path.join(tmpdir,tmpfile)) 
tmpfile2 = tmpfile+".bat" 
tmpfile3 = tmpfile+".txt" 

fa = open(tmpfile2,'w') 
fa.write("@ECHO OFF > NUL\n") 
fa.write('call '+cmd+"\n") 
fa.close() 

wcmd = [] 
wcmd.append(tmpfile2) 

startupinfo = subprocess.STARTUPINFO() 
startupinfo.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW 

fb = open(tmpfile3,'w') 
fb.write("\n") 
fb.write(tmpfile2+"\n") 

try: 
    procval = subprocess.Popen(wcmd, startupinfo=startupinfo, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate() 
    fb.write(str(procval)+"\n") 
    fb.write("Sucess") 
    fb.close() 
except: 
    fb.write(str(procval)+"\n") 
    fb.write("Failure") 
    fb.close() 

Cuando ejecuto el uso de Python .exe Obtengo el resultado esperado. Cuando lo ejecuto usando pythonw.exe termino en el lado de la excepción. Si ejecuto el comando popen con solo el comando y los indicadores de startupinfo, el comando se completará satisfactoriamente pero no tendrá acceso a los datos en los procesos secundarios. Todo lo que leí dijo que esto debería funcionar, pero debe faltar algo. Cualquier ayuda sería muy apreciada.

Gracias, Randy

+0

¿Ha registrado la información de excepción? – jdi

+0

Lo he intentado pero no con éxito. Esto es bastante fácil de replicar así que cualquier idea sobre cómo obtener la información de excepción y le dará una oportunidad – user1352650

+0

No entiendo. ¿Tiene un código que golpea un bloque genérico excepto pero no puede mostrarnos esa excepción? Cámbielo a: "excepto Excepción, e" y registre el e. O simplemente levante al final para que pueda ver cuál es el error – jdi

Respuesta

10

Este es posiblemente un error al utilizar pythonw.exe

pythonw.exe inicia un proceso de demonio que no tiene el acceso normal a los descriptores de fichero estándar. Lo único que tendría que hacer en el script es establecer específicamente la tercera fd de entrada estándar:

p = subprocess.Popen(wcmd, 
        startupinfo=startupinfo, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.STDOUT, 
        stdin=subprocess.PIPE) 
procval = p.communicate() 
+0

El enlace da un 404 :( – msiemens

4

(unos pocos años de retraso con esta respuesta ...) me he encontrado con el mismo problema y encontré que debe sustituir este:

stdout = subprocess.PIPE

con esto:

entrada estándar = sub process.PIPE

Aquí está mi conjetura sobre el problema subyacente: pythonw inicia el proceso sin stdin (tiene sentido, ya que no hay consola). El subproceso intenta acceder a stdin y esto causa un error.

Una alternativa es usar/dev/null para stdin, consulte este hilo para obtener una explicación sobre cómo hacerlo: Ignoring output from subprocess.Popen (excepto que querrá usar devnull en stdin).

+0

puede que tenga algunos años de retraso con la respuesta, pero todavía me ayudó :) –

Cuestiones relacionadas