简体   繁体   中英

Subprocess communicate: order matters?

So I'm trying to effectively create a "branch" in a pipe from subprocess. The idea is to load a file with Popen into a pipe's stdout. Then, I can send that stdout to two (or more) stdin's. This works, more or less. The problem comes when the process needs to see an EOF. As far as I can tell, this happens when you use communicate(None) on a subprocess. However, it also seems to depend on the order I spawned the two processes I'm trying to send data to.

#!/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()

As long as I use queue[1] , things hang at the communicate() line. But if I use queue[2] , things don't hang. What's going on? It shouldn't depend on the order the subprocesses were created, should it?

(The in.txt file can really be anything, it doesn't matter.)

I can't see any reason why it would be different for any one of the processes. In any case, closing the stdin pipes will cause Python to send the EOF, ending the processes:

...

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()

...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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