5

サブプロセスを使用して実行されているC++プログラムの一連のprintステートメントからデータを読み取ろうとしています。

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'オブジェクトには属性'communicate'がありません」と通知します。

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

4

1 に答える 1

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

stderrをキャプチャする機能を自分に与えていないので、何か意味のあるものを手に入れたふりをしてはいけません。

于 2012-07-11T14:12:58.660 に答える