子流程不提供 Flow 的输出

Subprocess does not give output with Flow

我正在尝试从 python 脚本调用 facebook/flow 命令。它没有给出预期的 resultresult 变量是 (b'', None).

p = subprocess.Popen(["/usr/local/bin/flow", "--help"], stdout=subprocess.PIPE)
result = p.communicate()    
print(result)

我在 Mac OS X Yosemite 上安装了 flow,并且可执行文件存在于使用的目录中。我还安装了 R,当我使用下面的代码时,它会产生有效的输出 ( b'b'\nUsage: R [options] [< infile] [> outfile]\n', None).

p = subprocess.Popen(["/usr/local/bin/R", "--help"], stdout=subprocess.PIPE)
result = p.communicate()    
print(result)

为什么 subprocess 不只针对 flow 失败?我错过了什么吗?

编辑

使用下面的代码产生预期的输出,

p = subprocess.Popen(["/usr/local/bin/flow", "--help"], stderr=subprocess.PIPE)
result = p.communicate()    
print(result)

对此行为有任何说明吗?

很有可能,当你执行命令时 -

/usr/local/bin/flow --help

进程正在将其输出写入 stderr 而不是 stdout。因此,只有当您还对 stderr 输出进行管道传输时,您才会获得输出。例子-

p = subprocess.Popen(["/usr/local/bin/flow", "--help"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

这会在 stdout 和 stderr 中进行管道传输,然后您可以使用您需要的输出。

Popen.communicate() returns 格式的元组 - (stdout, stderr) - 因此元组中的第二个元素将包含您需要的数据。