2014-12-07 58 views
2

我想知道什麼時候管道的寫入結束關閉。有沒有辦法做到這一點?找出管道的寫入結束是否關閉

from subprocess import Popen, PIPE 
p = subprocess.Popen('ls -lh', stdout = PIPE, shell = True) 

def read_output(out,queue): 
    for line in iter(out.readline,b''): 
     print('.') 

t = Thread(target=enqueue_output, args=(p.stdout,q)) 
t.daemon = True 
t.start() 

while True: 
    #this only works if I put 
    #if line == '' : 
    # out.close() 
    #in the for loop of read_output, which I want to avoid. 

    if p.stdout.closed : #need to find something else than closed here... 
     break 

督察我試圖避免必須在IO線程做out.close()......我想以某種方式讀出的屬性或p.stdout的方法來知道它寫目前已關閉。

這實際上不是尋找另一種方式來優雅地閱讀Popen的p.stdout,我已經有2種其他方式。這更多是關於學習一些我認爲應該可能的事情,但我無法想象如何去做...

乾杯!

回答

1

如果管道損壞,寫入標準輸出將導致IOError被觸發。 您可以通過捕捉IOError並檢查其屬性errno檢測這個:

import errno 

while True: 
    print "Hello" 
except IOError as e: 
    if e.errno == errno.EPIPE: 
     print >>sys.stderr, "Error writing to closed pipe" 

或者,你可以安裝在接收SIGPIPE的信號處理程序。

import signal 
def sigpipe_handler(e): 
    # Do whatever in response to a SIGPIPE signal 

signal.signal(signal.SIGPIPE, sigpipe_handler) 
+0

感謝您的回答,但這不是我要找的。 p是產生s​​hell的子進程。 p.stdout由shell進程編寫,並由我讀取。我不能也不想模擬shell進程並嘗試寫入其stdout。我只想知道shell進程是否已關閉管道的末端。如果我在p.stdout而不是readline上執行read_raw會引發EOFError,但是由於readline捕獲了這些,所以我什麼也得不到。我仍然相信有一種方法可以看到p.stdout的寫入側的句柄已關閉。 – caliloo 2014-12-08 01:41:23

相關問題