子流程通信:顺序很重要



所以我试图从子进程有效地在管道中创建一个"分支"。其思想是将带有Popen的文件加载到管道的标准输出中。然后,我可以将该标准输出发送给两个(或更多)标准输出。这或多或少是可行的。当进程需要查看EOF时,问题就出现了。据我所知,当您在子进程上使用communication (None)时,就会发生这种情况。然而,它似乎也取决于我生成的两个进程的顺序,我试图向它们发送数据。

#!/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文件可以是任何东西,没关系)

我看不出任何一个进程有什么不同的原因。在任何情况下,关闭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()
...

最新更新