Ell*_*iot 5 python subprocess stdout communicate
我试图从使用子进程运行的C++程序中的一组打印语句中读出数据.
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
Run Code Online (Sandbox Code Playgroud)
Python代码:
run = subprocess.call('Name', stdout = subprocess.PIPE, env={'LANG':'C++'})
data, error = run.communicate()
Run Code Online (Sandbox Code Playgroud)
然而,不是获取数据,我得到的只是一个int,退出代码,0或错误代码.当然,python然后告诉我"AttributeError:'int'对象没有属性'communic'".
我如何实际获取数据(printf)?
subprocess.call只是运行命令并返回其退出状态(在 python 中,退出状态可以通过设置sys.exit(N)- 在其他语言中,退出状态由不同的方式确定)。如果您想实际掌握该流程,则需要使用subprocess.Popen. 所以,对于你的例子:
run = subprocess.Popen('Name', stdout = subprocess.PIPE, env={'LANG':'C++'})
data, error = run.communicate()
Run Code Online (Sandbox Code Playgroud)
现在可以通过该属性获得程序退出状态returncode。
另外,作为风格问题,我会这样做:
run = subprocess.Popen('Name', stdout = subprocess.PIPE, stderr = subprocess.PIPE, env={'LANG':'C++'})
data, error = run.communicate()
Run Code Online (Sandbox Code Playgroud)
或者:
run = subprocess.Popen('Name', stdout = subprocess.PIPE, env={'LANG':'C++'})
data, _ = run.communicate()
Run Code Online (Sandbox Code Playgroud)
由于您没有赋予自己捕获 stderr 的能力,因此您可能不应该假装自己得到了有意义的东西。
| 归档时间: |
|
| 查看次数: |
2207 次 |
| 最近记录: |