【问题标题】:Getting the output of a python subprocess获取python子进程的输出
【发布时间】:2011-09-08 22:01:59
【问题描述】:

我正在尝试捕获此处的输出。如果在 python 提示符下,我运行

p = subprocess.Popen(["/path/to/search_by_hash.par", hash_str], 
                      stdout=subprocess.PIPE)

返回值(列表)打印到标准输出,但未被捕获

[4460475, 4406612, 4379510]

我已经尝试过跟进

value = p.communicate()[0]
value

..but value 是一个空字符串,而不是我期望的整数列表,并且正在打印到标准输出

我尝试了Store output of subprocess.Popen call in a string 的解决方案,但无法捕获输出。

更新:

stderr 似乎也没有产生任何东西......我正在寻找的列表 正在打印出来......只是没有任何运气来捕捉它。见下文:

>>> p = subprocess.Popen(["/home/jfry/tools/search_by_hash.par", hash_str], 
                          stdout=subprocess.PIPE)
>>> 
[4460475, 4406612, 4379510]
    value, err  = p.communicate()
>>> value
''
>>> err

谢谢!

【问题讨论】:

  • 试试value = p.communicate()[0]
  • 您是要捕获发送到子进程标准输出的数据,还是要捕获子进程的退出状态?
  • Jakob - 谢谢,这是我的问题中的一个错字,但不是在提示符下。我已经改变了问题。
  • Adam - 我想要返回 value,在这种情况下是整数列表,例如[4460475、4406612、4379510]
  • 添加stderr=subprocess.PIPE,就像你已经拥有的标准输出一样

标签: python subprocess


【解决方案1】:

尝试检查stderrp.communicate()[1]

【讨论】:

  • Zeekay,是的,我想要命令的输出——在我输入命令后,屏幕上打印的内容。不幸的是,p.stdout.read() 和 p.communicate()[0] 都没有成功捕获输出。相反,两者都给我一个空字符串。
  • @Jeff 尝试检查stderr, `p.communicate()[1] 以了解发生了什么。
  • 好建议,但没有骰子。我用 python 提示符的确切结果更新了问题。谢谢。
  • 好的,上面 mita 建议在我的 Popen 中包含“stderr=subprocess.PIPE”,我现在可以通过 p.communicate()[1] 看到 stderr。谢谢!
【解决方案2】:

因为接受的答案并不能解决问题(至少对我而言):

要捕获stderr-输出,应执行以下操作:

import subprocess
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)        
output, err = p.communicate()

关键部分是参数stderr=subprocess.PIPE,如果没有这个参数,stderr-output 将不会被捕获,err 将是None

如果您只对stderr-输出感兴趣,您实际上可以使用:

p = subprocess.Popen(command, stderr=subprocess.PIPE)        
err = p.communicate()[1]

在这种情况下,p.communicate()[0]None

【讨论】:

    【解决方案3】:

    沟通是一种方法。所以你应该打电话给它!

    out = p.communicate()
    

    【讨论】:

    • 谢谢,这是我的问题中的一个错字,但不是在提示符下。我已经改变了问题。