【问题标题】:Subprocess communicate: order matters?子流程沟通:订单重要吗?
【发布时间】:2011-08-13 01:07:59
【问题描述】:

所以我试图在子进程的管道中有效地创建一个“分支”。这个想法是将带有 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 pipe subprocess


    【解决方案1】:

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

    【讨论】:

    • 顺便说一句,如果您不希望子进程将其输出打印到屏幕上,请将其 stdout 也设置为 PIPE。
    猜你喜欢
    • 2011-06-04
    • 2016-04-02
    • 2016-06-19
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多