[英]Subprocess communicate: order matters?
所以我試圖從子進程中有效地在 pipe 中創建一個“分支”。 這個想法是將帶有 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 發送 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()
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.