2009-11-30 16 views
6

Estoy ejecutando un subprograma que utiliza subprocess.popen. Cuando inicio mi programa Python desde la ventana de comandos (cmd.exe), el programa escribe información y fechas en la ventana a medida que el programa evoluciona.lectura asíncrona stdout del subproceso.Popen

Cuando ejecuto mi código de Python no en una ventana de comandos, abre una nueva ventana de comandos para la salida de este subprograma, y ​​quiero evitar eso. Cuando he usado el siguiente código, que no muestra la ventana de cmd, pero también no se imprime el estado:

p = subprocess.Popen("c:/flow/flow.exe", shell=True, stdout=subprocess.PIPE) 
print p.stdout.read() 

¿Cómo puedo mostrar la salida del sub-programa en la producción de mi programa a medida que se produce?

+2

¿Por qué es esta comunidad wiki? –

+2

"ventana de Windows" ¿Qué ventana de Windows? ¿Estás usando un marco GUI? ¿Cúal? –

+0

bueno, estoy ejecutando el modelo a través de arcgis. cuando hago clic en mi herramienta que creé allí, aparece una ventana que muestra el progreso. Quiero ver líneas que aparecen en mi ventana de comandos. – Mesut

Respuesta

7

Utilice esta:

cmd = subprocess.Popen(["c:/flow/flow.exe"], stdout=subprocess.PIPE) 
for line in cmd.stdout: 
    print line.rstrip("\n") 
cmd.wait() # you may already be handling this in your current code 

Tenga en cuenta que todavía tendrá que esperar a que el sub-programa para limpiar su memoria intermedia de salida estándar (que comúnmente se tampona de forma diferente cuando no está escribiendo a una ventana de terminal), por lo que puede no vea cada línea instantáneamente mientras el subprograma la imprime (esto depende de varios detalles del sistema operativo y detalles del subprograma).

Observe también cómo he eliminado el intérprete de comandos = True y reemplazado el argumento de cadena con una lista, que generalmente se recomienda.

+0

alternativamente a 'line.rstrip ..' puede usar 'línea' (tenga en cuenta la coma que se arrastra) –

+2

['for line in iter (cmd.stdout.readline," "): línea de impresión,'] (http://stackoverflow.com/questions/2804543/read-subprocess-stdout-line-by-line) podría proporcionar un resultado más inmediato al evitar el buffer de lectura anticipada en el iterador de archivos (Nota: el subprograma aún debe vaciar su stdout) – jfs

+1

No veo por qué esto es asincrónico. – ManuelSchneid3r

Cuestiones relacionadas