2011-12-28 38 views
1

我使用subprocess.Popen(在POSIX系統上爲Python 2.x)調用子進程。我希望能夠使用Python的readline()文件對象函數讀取子進程的輸出。但是,Popen.stdout中的可用流沒有出現readline()方法。如何將readline()與subprocess返回的管道一起使用.Popen

使用想法從Python readline from pipe on Linux,我試過如下:

p = subprocess.Popen(
    [sys.executable, "child.py"], 
    stdout=subprocess.PIPE) 
status = os.fdopen(p.stdout.fileno()) 
while True: 
    s = status.readline() 
    if not s: 
     break 
    print s 

然而,這種方法的問題是,p.stdout對象和新status對象試圖關閉一個文件描述符。這最終導致:

close failed: [Errno 9] Bad file number 

有沒有辦法創建一個文件對象「包裝」一個以前創建的文件類對象?

+1

你如何得到具有'.fileno()'但沒有'.readline()'方法的'p.stdout'? – jfs 2012-01-24 04:43:53

+0

@ J.F.Sebastian:這是一個很好的問題。我只是再試一次,'p.stdout.readline()'工作正常。可能是我錯誤地嘗試了'p.readline()',這有點令人尷尬。 – 2012-01-24 05:16:02

回答

2

的解決方案是使用os.dup()創建另一個文件描述符指的是同一個管道:

status = os.fdopen(os.dup(p.stdout.fileno())) 

這樣,status都有自己的文件描述符關閉。

+1

這很令人吃驚,多麼簡單*寫*問題使答案顯而易見。 – 2011-12-28 21:53:34