簡體   English   中英

子流程溝通:訂單重要嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM