带有stdout重定向的Python子进程返回一个int

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

mgi*_*son 4

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 的能力,因此您可能不应该假装自己得到了有意义的东西。