2012-07-11 20 views
5

サブプロセスを使用して実行されているC++プログラムでprintステートメントのセットからデータを読み出そうとしています。stdoutリダイレクトによるPythonのサブプロセスがintを返す

C++コード:

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

代わりにデータを取得するしかし、私は取得していますすべてが単一のint、終了コードで、0またはエラーコード。もちろん、Pythonは私に "AttributeError: 'int'オブジェクトに属性 'communications'がないことを伝えます。

実際にデータ(printf)を取得するにはどうすればよいですか?

答えて

4

subprocess.callコマンドを実行するだけで終了ステータスが返されます(Pythonでは終了ステータスはsys.exit(N)で設定できます - 他の言語では終了ステータスは別の方法で決まります)。プロセスで実際にハンドルを取得する場合は、subprocess.Popenを使用する必要があります。だから、あなたの例:

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

プログラムの終了ステータスがreturncode属性で使用できるようになりました。

また、スタイルの問題として、私はどうしたら、次のいずれか

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

か:

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

をあなた自身に標準エラー出力をキャプチャする機能を与えていないので、あなたはおそらく「shouldn意味のある何かを得たようなふりをする。

関連する問題