将subprocess.Popen调用的输出存储在字符串中

430 投票
15 回答
709030 浏览
提问于 2025-04-15 20:46

我正在尝试在Python中进行系统调用,并把输出结果存储到一个字符串里,这样我就可以在Python程序中对它进行操作。

#!/usr/bin/python
import subprocess
p2 = subprocess.Popen("ntpq -p")

我试过一些方法,包括这里的一些建议:

获取subprocess.call()的输出

但都没有成功。

15 个回答

54

这个方法对我来说有效,可以用来重定向标准输出(标准错误输出也可以用类似的方法处理):

from subprocess import Popen, PIPE
pipe = Popen(path, stdout=PIPE)
text = pipe.communicate()[0]

如果这个方法对你不管用,请具体说明你遇到的问题。

60

Python 3.7及以上版本中,你可以使用新的capture_output=这个参数来调用subprocess.run函数:

import subprocess

p = subprocess.run(["echo", "hello world!"], capture_output=True, text=True)
assert p.stdout == 'hello world!\n'
594

在 Python 2.7 或 Python 3 中

你可以使用 subprocess.check_output() 函数,而不是直接创建一个 Popen 对象,这样可以把命令的输出存储在一个字符串里:

from subprocess import check_output
out = check_output(["ntpq", "-p"])

在 Python 2.4-2.6 中

使用 communicate 方法。

import subprocess
p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE)
out, err = p.communicate()

out 就是你想要的输出。

关于其他答案的重要说明

注意我传入命令的方式。"ntpq -p" 这个例子涉及到另一个问题。因为 Popen 不会调用 shell,所以你需要用一个命令和选项的列表来表示——["ntpq", "-p"]

撰写回答