可以让subprocess.call将输出写入字符串吗?

25 投票
5 回答
32938 浏览
提问于 2025-04-16 17:04

我想使用subprocess.call这个功能,并把调用的结果输出到一个字符串里。我可以直接这样做吗,还是说我需要先把结果写到一个文件里,然后再从文件里读取?

换句话说,我能不能把标准输出和错误输出直接转到一个字符串里呢?

5 个回答

6

subprocess模块提供了一个叫做check_output()的方法,这个方法可以运行你给定的命令和参数(如果有的话),并把运行结果以字节字符串的形式返回。

output = subprocess.check_output(["echo", "hello world"])
print output

上面的代码会打印出hello world

查看文档:https://docs.python.org/2/library/subprocess.html#subprocess.check_output

42

这是对mantazer在python3方面回答的一个扩展。你仍然可以在python3中使用 subprocess.check_output 命令:

>>> subprocess.check_output(["echo", "hello world"])
b'hello world\n'

不过现在它返回的是一个字节字符串。要得到一个真正的python字符串,我们需要使用解码(decode):

>>> subprocess.check_output(["echo", "hello world"]).decode(sys.stdout.encoding)
'hello world\n'

使用 sys.stdout.encoding 作为编码,而不是仅仅使用默认的 UTF-8,理论上应该可以在任何操作系统上都能正常工作。

最后的换行符(以及其他多余的空白)可以通过 .strip() 很容易地去掉,所以最终的命令是:

>>> subprocess.check_output(["echo", "hello world"]
                            ).decode(sys.stdout.encoding).strip()
'hello world'
11

不,你不能直接把subprocess.call()的输出读到一个字符串里。

如果想把一个命令的输出读到字符串中,你需要使用subprocess.Popen(),比如:

>>> cmd = subprocess.Popen('ls', stdout=subprocess.PIPE)
>>> cmd_out, cmd_err = cmd.communicate()

cmd_out会包含这个命令的输出字符串。

撰写回答