2012-07-11 23 views
5

Estoy tratando de leer datos de un conjunto de instrucciones de impresión en un programa C++ que se está ejecutando mediante un subproceso.Subproceso de Python con redirección stdout que devuelve un int

código C++:

código
printf "height= %.15f \\ntilt = %.15f \(%.15f\)\\ncen_volume= %.15f\\nr_volume= %.15f\\n", height, abs(sin(tilt*pi/180)*ring_OR), abs(tilt), c_vol, r_vol; e; //e acts like a print 

Python:

run = subprocess.call('Name', stdout = subprocess.PIPE, env={'LANG':'C++'}) 
data, error = run.communicate() 

Sin embargo en lugar de obtener los datos, todo lo que estoy haciendo es un int, el código de salida, ya sea un error de 0 o un código. Por supuesto, Python me dice "AttributeError: 'int' object no tiene atributo 'communicate'".

¿Cómo obtengo realmente los datos (el printf)?

Respuesta

4

subprocess.call simplemente ejecuta el comando y devuelve su estado de salida (En python, el estado de salida se puede establecer en sys.exit(N) - En otros idiomas, el estado de salida se determina por medios diferentes). Si realmente desea hacerse cargo del proceso, deberá usar subprocess.Popen. Así que, por su ejemplo:

run = subprocess.Popen('Name', stdout = subprocess.PIPE, env={'LANG':'C++'}) 
data, error = run.communicate() 

El estado de los programas de salida ya está disponible a través del atributo returncode.

También, como una cuestión de estilo, lo haría bien hacer:

run = subprocess.Popen('Name', stdout = subprocess.PIPE, stderr = subprocess.PIPE, env={'LANG':'C++'}) 
data, error = run.communicate() 

o:

run = subprocess.Popen('Name', stdout = subprocess.PIPE, env={'LANG':'C++'}) 
data, _ = run.communicate() 

Puesto que no se está dando la posibilidad de capturar stderr, es probable que shouldn' fingir que tienes algo significativo.

Cuestiones relacionadas