我想做subprocess.call,并将调用的输出变为字符串。我可以直接执行此操作,还是需要将其传输到文件中,然后从中读取?
换句话说,我可以以某种方式将stdout和stderr重定向到字符串中吗?
答案 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()
相同的参数,其中包含stdout
和stderr
参数。有关详细信息,请参阅文档。