子流程沟通:订单有关系吗?

时间:2011-08-13 01:08:00

标签: python pipe subprocess

所以我试图在子进程的管道中有效地创建一个“分支”。我的想法是将带有Popen的文件加载到管道的标准输出中。然后,我可以将stdout发送到两个(或更多)stdin。这或多或少都有效。当进程需要查看EOF时会出现问题。据我所知,当你在子进程上使用通信(无)时会发生这种情况。但是,它似乎也依赖于我生成的两个进程的顺序,我正在尝试将数据发送到。

#!/usr/bin/env python
from subprocess import *
import shutil
import os
import shlex

inSub=Popen(shlex.split('cat in.txt'),stdout=PIPE)
print inSub.poll()

queue=[]
for i in range(0,3):
    temp=Popen(['cat'],stdin=PIPE)
    queue=queue+[temp]

while True:
    # print 'hi'
    buf=os.read(inSub.stdout.fileno(),10000)
    if buf == '': break
    for proc in queue:
        proc.stdin.write(buf)

queue[1].communicate()
print queue[1].poll()

只要我使用queue[1],就会挂起communicate()行。但是,如果我使用queue[2],事情就不会挂起。这是怎么回事?它应该不依赖于子进程的创建顺序,是吗?

(in.txt文件可以是任何东西,无所谓。)

1 个答案:

答案 0 :(得分:1)

我看不出任何一个过程会有什么不同的原因。在任何情况下,关闭stdin管道将导致Python发送EOF,结束进程:

...

while True:
    # print 'hi'
    buf = os.read(inSub.stdout.fileno(),10000)
    if buf == '': break
    for proc in queue:
        proc.stdin.write(buf)

for proc in queue:
    proc.stdin.close()

queue[1].communicate()

...