如何将几个进程的输出连接到另一个进程的输入?

时间:2014-03-10 05:00:11

标签: python subprocess pipe popen

我正在编写一个执行进程列表的脚本,并将所有输出连接到另一个进程的输入中。我已经将我的脚本压缩成一个测试用例,使用echo和cat作为实际过程的替身。

#!/usr/bin/python

import os,subprocess

(pipeOut, pipeIn) = os.pipe()

catProcess = subprocess.Popen("/bin/cat", stdin = pipeOut)

for line in ["First line", "Last line"]:
    subprocess.call(["/bin/echo",line], stdout = pipeIn)

os.close(pipeIn)
os.close(pipeOut)

catProcess.wait()

该程序按预期工作,但对catProcess.wait()的调用挂起(可能是因为它仍在等待更多输入)。将close_fds=True传递给Popencall似乎也无济于事。

有没有办法关闭catProcesses的标准输入,以便它优雅地退出?或者有其他方式来编写这个程序吗?

1 个答案:

答案 0 :(得分:1)

close_fds=True传递给catProcess有助于我的系统。

您无需明确创建管道:

#!/usr/bin/python
from subprocess import Popen, PIPE, call

cat = Popen("cat", stdin=PIPE)
for line in ["First line", "Last line"]:
    call(["echo", line], stdout=cat.stdin)
cat.communicate() # close stdin, wait