2012-10-06 12 views
5

Disculpe por otra pregunta sobre los subprocesos de Python, pero no pude encontrar una respuesta a esta.Subproceso de Python en Windows 7 64bit - sin salida cuando stdout = PIPE

Tengo problemas con algún código de Python que invoca un subproceso en Windows 7 de 64 bits. Cuando el stdout del subproceso se envía a una tubería, no se produce salida. El subproceso parece ejecutarse y terminar sin problemas, simplemente no produce ningún resultado.

EDITAR: El mismo código funciona correctamente en WinXP 32bit, así que actualicé el título de la pregunta.

# (listing 1) 
from subprocess import * 
#cmdline= (a valid command line) 
proc = Popen(cmdline,shell=True,stdout=PIPE,stderr=PIPE) 
out, err = proc.communicate() 
print(out) 
print(err) 

Esto da salida

out: 

err: 

Sin embargo, cuando la salida del subproceso no es hilo, se produce una salida como se esperaba:

# (listing 2) 
proc = Popen(cmdline,shell=True) 
proc.communicate() 

Esto da el resultado esperado a la consola.

Estoy seguro de que el ejecutable está escribiendo su salida a stdout. Tengo el código fuente en C, y añadí la línea:

fprintf(stdout, "HELLO"); 

Una vez más, "HOLA" se ve cuando se ejecuta el Listado 2, pero no en la lista 1.

También intenté hacer un nuevo C++ ejecutable y llamando a que desde cmdline:

#include <iostream> 

int main() 
{ 
    std::cout << "HELLO" << std::endl; 
} 

lo mismo sigue sucediendo - "HOLA" se ve cuando se ejecuta el listado 2, pero no en la lista 1.

Si fijo línea_de_órdenes a 'dir', lo esperado Happe ns para el listado 1 y el listado 2 - los contenidos del directorio se imprimen en la consola.

Otras cosas que probé: Python 3.3 y Python 2.7 (mismos resultados); bufsize = 0 (mismos resultados); comprobando proc.returncode (es 0, como se esperaba); eliminando stderr = PIPE (en cuyo caso el listado 1 da "err: None" como se esperaba).

EDITAR - También probé = proc.stdout en lugar del método de comunicación() con los mismos resultados. La documentación de Python y otras preguntas sugieren que el método de comunicación() es el correcto para usar.

+1

intente algunos ejemplos de [¿Cómo obtengo todos los resultados de mi .exe utilizando subproceso y Popen?] (Http://stackoverflow.com/a/12606327/4279) – jfs

+0

¿cómo ejecuta el script? ¿Qué es cmdline? – jfs

+0

Gracias. Ya intenté hacer readline() en proc.stdout en lugar de usar comunicar() pero esto todavía no produce ningún resultado. La documentación de Python y otras preguntas sobre stackoverflow sugieren que se prefiere el método de comunicación(), así que lo escribí de esa manera en mi pregunta. Edité la pregunta para agregar esta información. La línea de comando para ejecutar el script es solo C: \ Python27 \ python.exe myscript.py. –

Respuesta

2

No es un problema de Python en absoluto. La configuración de mi firewall tenía "espacio aislado" para los ejecutables, y esto causó que su salida se descartara sin ningún tipo de advertencia o error.

Habría tenido más sentido evitar que se ejecuten. Creo que necesito usar un software de firewall diferente.

+0

¿por qué los ejecutables producen salida sin 'stdout = PIPE'? – jfs

+0

¿Tal vez hay algunas formas de explotar las tuberías? De todos modos, deberían haber registrado un gran mensaje de advertencia que decía "Salida deshabilitada para el programa.exe" ... –

+0

Es interesante. ¿'Hello.exe> ​​output.txt' produce un archivo vacío, pero el simple' hello.exe' imprime HELLO? El primero en Python: 'con open ('output.txt', 'wb') como f: check_call (r '. \ Hello.exe', stdout = f)' el último podría ser emulado con el módulo pexpect (su análogo de Windows) – jfs

Cuestiones relacionadas