2011-08-13 29 views
3

所以我試圖從子流程中有效地在管道中創建一個「分支」。這個想法是用Popen將文件加載到管道的stdout中。然後,我可以將該stdout發送給兩個(或更多)標準輸入。這或多或少起作用。當進程需要看到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

我看不出有任何理由爲什麼它會是對過程中的任何一個不同。在任何情況下,關閉標準輸入管道將導致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() 

... 
+0

順便說一句,如果你不希望孩子進程將它們的輸出打印到屏幕中,將其標準輸出管道的好。 –