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



>我正在尝试将 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)
你需要

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'hellon'

似乎我需要subprocess.check_output方法:

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

正如我所期望的那样,output现在'hellon'(包括换行符(。

相关内容

最新更新