可以让subprocess.call将输出写入字符串吗?
我想使用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会包含这个命令的输出字符串。