获取Python子进程的输出

8 投票
3 回答
16621 浏览
提问于 2025-04-16 19:00

我正在尝试捕捉这里的输出。如果在Python的命令行中,我运行

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

返回的值(一个列表)会打印到标准输出,但没有被捕捉到

[4460475, 4406612, 4379510]

我尝试在后面加上

value = p.communicate()[0]
value

...但是得到的值是一个空字符串,而不是我期待的整数列表,这个列表确实在标准输出中被打印出来了

我试过从存储subprocess.Popen调用的输出到字符串中找到解决方案,但还是没能捕捉到输出。

更新:

标准错误输出似乎也没有任何结果...而我想要的列表确实被打印出来了...只是没有运气能捕捉到它。请看下面:

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

谢谢!

3 个回答

1

communicate是一个方法。所以你应该去调用它!

out = p.communicate()
5

因为之前的回答对我来说并没有解决问题:

要捕获 stderr 的输出,需要做以下操作:

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

关键在于参数 stderr=subprocess.PIPE,如果没有这个参数,stderr 的输出就无法被捕获,err 将会是 None

如果你只对 stderr 的输出感兴趣,其实可以使用:

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

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

5

试着用 p.communicate()[1] 来查看 stderr 的内容。

撰写回答