Подпроцесс общения: порядок имеет значение? - PullRequest
3 голосов
/ 13 августа 2011

Итак, я пытаюсь эффективно создать «ветку» в трубе из подпроцесса.Идея состоит в том, чтобы загрузить файл с Popen в стандартный поток канала.Затем я могу отправить этот стандартный вывод двум (или более) стандартным устройствам.Это работает, более или менее.Проблема возникает, когда процесс должен увидеть 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 Ответ

1 голос
/ 13 августа 2011

Я не вижу никакой причины, почему это было бы иначе для любого из процессов.В любом случае закрытие каналов 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()

...
...