2011-08-13 2 views
3

私はサブプロセスからパイプに効果的に "ブランチ"を作成しようとしています。ポッペンのファイルをパイプのstdoutにロードすることです。その後、私はstdoutを2つ(またはそれ以上)のstdinに送ることができます。これは多かれ少なかれ動作します。この問題は、プロセスがEOFを参照する必要があるときに発生します。私が知る限り、これは、サブプロセスで通信(なし)を使用する場合に発生します。しかし、それはまた私がデータを送信しようとしている2つのプロセスを生み出した順序に依存するようです。サブプロセス通信:注文事項は?

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

私はそれがいずれかの処理のために異なるだろう、なぜ何らかの理由を見ることができません。いずれの場合も、標準入力パイプを閉じるとプロセスを終了、EOFを送信するためにはPythonが発生します:あなたは子プロセスが画面に出力を印刷したくない場合は、

... 

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

... 
+0

ところで、としてPIPEへの標準出力を設定しますよく –

関連する問題