2011-05-05 33 views
7

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

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

+0

也许相同http://stackoverflow.com/questions/2502833/python -ore-output-of-subprocess-call-in-a-string – aeter 2011-05-05 18:54:16

回答

8

不,你不能直接读取subprocess.call()的输出到字符串中。

为了读取命令的输出成一个字符串,你需要使用subprocess.Popen(),例如:

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

cmd_out将与命令的输出字符串。

2

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

+0

在网上查看文档不是很清楚,你能否提供一个例子,就像使用Popen的其他答案一样。或者以stdout = subprocess.PIPE为例,说明如何获得标准输出值的明确示例。答案与Popen答案相同吗? – David 2014-12-30 08:23:30

+0

它实际上是一样的,因为两个函数都有相同的参数。 – 2014-12-30 16:52:43

4

这是mantazer的回答python3的延伸。您仍然可以在python3使用subprocess.check_output命令:

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

但是现在它给了我们一个字节的字符串。为了得到我们需要用解码一个真正的Python字符串:

>>> 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' 
相关问题