如何使用子进程Popen.communicate()方法?

时间:2017-05-24 10:01:11

标签: python subprocess

我试图在Python中将bash命令的标准输出作为字符串。在Popen文档后,我尝试过:

import subprocess

p = subprocess.Popen(["echo", "hello"])
stdoutdata, stderrdata = p.communicate()

print stdoutdata

运行此脚本会产生以下输出:

hello
None
[Finished in 0.0s]

因此虽然输出是由Python打印的,但stdoutdata变量是None,而不是我想要的"hello"。我怎么能这样做?

3 个答案:

答案 0 :(得分:4)

您没有向Popen构造函数提供任何标准输出,默认功能只是将输出写入父级的标准输出句柄。因此,您将看到它被打印在您的shell中。

引自Popen's docs

  

使用None的默认设置,不会发生重定向;子项的文件句柄将从父项继承。

要在结果元组中填充stdout,请使用subprocess.PIPE作为标准输出。

引自docs

  

要在结果元组中获取None以外的任何内容,您需要给予   stdout=PIPE和/或stderr=PIPE

>>> import subprocess
>>> p = subprocess.Popen(["echo", "hello"], stdout=subprocess.PIPE)
>>> p.communicate()
('hello\n', None)

答案 1 :(得分:1)

您需要将stdoutstderr标记传递给Popen构造函数 默认情况下,它们设置为None,导致Popen未捕获它们。

cmd = subprocess.Popen(["echo", "hello"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = cmd.communicate()
# retCode = cmd.returncode
# retCode != 0, indicates an error occured in execution.
print (out)
>>> b'hello\n'

答案 2 :(得分:0)

似乎我需要subprocess.check_output方法:

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

正如我所料,output现在是'hello\n'(包括换行符)。