我试图在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"
。我怎么能这样做?
答案 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)
您需要将stdout
,stderr
标记传递给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'
(包括换行符)。