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

时间:2011-05-05 18:30:20

标签: python subprocess

我想做subprocess.call,并将调用的输出变为字符串。我可以直接执行此操作,还是需要将其传输到文件中,然后从中读取?

换句话说,我可以以某种方式将stdout和stderr重定向到字符串中吗?

4 个答案:

答案 0 :(得分:10)

不,您无法将subprocess.call()的输出直接读入字符串。

为了将命令的输出读入字符串,您需要使用subprocess.Popen(),例如:

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

cmd_out将包含带有命令输出的字符串。

答案 1 :(得分:7)

这是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'

答案 2 :(得分:5)

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

答案 3 :(得分:2)

subprocess.call()采用与subprocess.Popen()相同的参数,其中包含stdoutstderr参数。有关详细信息,请参阅文档。