繁体   English   中英

子流程沟通:订单重要吗?

[英]Subprocess communicate: order matters?

所以我试图从子进程中有效地在 pipe 中创建一个“分支”。 这个想法是将带有 Popen 的文件加载到管道的标准输出中。 然后,我可以将该标准输出发送到两个(或更多)标准输入。 这或多或少有效。 当进程需要查看 EOF 时,问题就出现了。 据我所知,当您在子进程上使用communicate(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 文件真的可以是任何东西,没关系。)

我看不出任何一个过程会有所不同的原因。 在任何情况下,关闭标准输入管道将导致 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()

...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM