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

Kur*_*eek 0 python subprocess

我正在尝试获取bash命令的标准输出作为Python中的字符串。根据Popen文档,我尝试过:

import subprocess

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

print stdoutdata
Run Code Online (Sandbox Code Playgroud)

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

import subprocess

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

print stdoutdata
Run Code Online (Sandbox Code Playgroud)

因此,尽管输出已通过Python打印,但stdoutdata变量为None,而不是"hello"我想要的。我该怎么做?

Ash*_*ary 5

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

引用Popen的文档

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


要在生成的元组中填充标准输出,请subprocess.PIPE用作标准输出。

引用文档

要获得None结果元组以外的任何内容,您也需要给出 stdout=PIPE和/或stderr=PIPE

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