【问题标题】:Python subprocess with stdout redirect returning an int带有标准输出重定向的 Python 子进程返回一个 int
【发布时间】:2012-07-11 04:20:34
【问题描述】:

我正在尝试从使用子进程运行的 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

Python 代码:

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

但是,我得到的不是数据,而是一个整数,即退出代码,0 或错误代码。当然,python 然后告诉我“AttributeError: 'int' object has no attribute 'communicate'”。

我如何实际获取数据(printf)?

【问题讨论】:

    标签: python subprocess stdout communicate


    【解决方案1】:

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

    既然你没有给自己捕获标准错误的能力,你可能不应该假装你有一些有意义的东西。

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 1970-01-01
      • 2011-07-04
      • 2023-04-05
      • 2011-01-10
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 2010-11-23
      相关资源
      最近更新 更多