>我正在尝试将 bash 命令的标准输出作为 Python 中的字符串。在 Popen 文档之后,我尝试过:
import subprocess
p = subprocess.Popen(["echo", "hello"])
stdoutdata, stderrdata = p.communicate()
print stdoutdata
运行此脚本将生成以下输出:
hello
None
[Finished in 0.0s]
因此,尽管输出是由 Python 打印的,但stdoutdata
变量是 None
,而不是我想要的"hello"
。我怎样才能做到呢?
您没有向 Popen 构造函数提供任何标准输出,默认功能只是将输出写入父级的 stdout 句柄。因此,您会看到它被打印在外壳中。
引用Popen
的文档:
使用默认设置
None
,不会发生重定向;子项的文件句柄将从父项继承。
要在生成的元组中填充标准输出,请使用subprocess.PIPE
作为标准输出。
引用文档:
要在结果元组中获取除
None
以外的任何内容,您需要给出stdout=PIPE
和/或stderr=PIPE
也是。
>>> import subprocess
>>> p = subprocess.Popen(["echo", "hello"], stdout=subprocess.PIPE)
>>> p.communicate()
('hellon', None)
将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'hellon'
似乎我需要subprocess.check_output方法:
import subprocess
output = subprocess.check_output(["echo", "hello"])
正如我所期望的那样,output
现在'hellon'
(包括换行符(。