2012-07-11 10 views
5

Sto cercando di leggere i dati da un insieme di istruzioni di stampa in un programma C++ che viene eseguito utilizzando un sottoprocesso.Sottoprocesso Python con reindirizzamento stdout che restituisce un int

codice C++:

codice
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() 

Tuttavia, invece di ottenere i dati, tutto quello che sto ottenendo è un singolo int, il codice di uscita, sia un errore di 0 o un codice. Ovviamente, python mi dice "AttributeError: 'int' object non ha attributo 'communicate'".

Come si ottengono effettivamente i dati (il printf)?

risposta

4

subprocess.call esegue semplicemente il comando e restituisce il suo stato di uscita (in python lo stato di uscita può essere impostato da sys.exit(N) - In altre lingue lo stato di uscita è determinato con diversi mezzi). Se si desidera ottenere effettivamente un controllo sulla procedura, è necessario utilizzare subprocess.Popen. Quindi, per il tuo esempio:

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

Lo stato di programmi di uscita è ora disponibile attraverso l'attributo returncode.

Inoltre, per una questione di stile, lo farei neanche fare:

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() 

Dal momento che non stai dando la possibilità di catturare stderr, probabilmente shouldn' Fai finta di avere qualcosa di significativo.