将subprocess.Popen调用的输出存储在字符串中
我正在尝试在Python中进行系统调用,并把输出结果存储到一个字符串里,这样我就可以在Python程序中对它进行操作。
#!/usr/bin/python
import subprocess
p2 = subprocess.Popen("ntpq -p")
我试过一些方法,包括这里的一些建议:
但都没有成功。
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"]
。