2011-03-27 89 views
0

爲什麼可能覆蓋sys.stdout而不是subprocess.Popen.stdout,用我自己的類。 如果它是可能的覆蓋,請告訴我怎麼...Python,爲什麼我不能重寫Popen.stdout

我正在一些GUI項目,我想在「real_time」text_view上打印其他程序的輸出,而不是當一切都完成時。

,當我重寫sys.stdout的我做財產以後這樣的:

class MyStdOut : 
    def __init__(self) : self.text = "" 
    def write(self, string) : self.text += string 

這裏是一些程序 'pyscript.py'

import os 

def main() : 
    for i in range(10) : 
    print i 
    os.system('sleep 0.1') ## this is just to make some delay, i did also 3 loops 

if __name__ == '__main__' : main() 

,這裏是主程序:

import subprocess as sub 

def main() : 
    popen = sub.Popen('./pyscript.py', stdout=sub.PIPE) 
    for line in popen.stdout : print 'Line :', line 
    print 'Main done' 

if __name__ == '__main__' : main() 

它仍然不是'真正的'時間,當它結束時我會得到一切。

我也試過溝通,但得到相同的結果。

在我的真實程序中,我必須在text_view(GUI GTK +)上打印其他程序的輸出。我懷疑subprocess.stdout必須是文件,但是當我試圖讓一些繼承自IOBase的類時,我也得到了錯誤。

大家都說這是可能的,但我仍然嘗試了許多不同的方式,但沒有成功。

+1

這段代碼與覆蓋sys.stdout有什麼關係?這是一些與sys.stdout完全無關的類。實現流不僅僅是實現write()。你試圖解決的實際問題是什麼?精確而且冗長 - 否則你的問題沒有多大意義。 – 2011-03-27 17:19:12

回答

2

可以使用達到相同的:

p = Popen(args, ..., stdout=subprocess.PIPE) 
for line in p.stdout: 
    print line 

其中p.stdout行爲就像PIPE,這樣你就可以儘快到達從中讀取數據。這不是嚴格的實時,因爲一些緩衝發揮作用,但這仍然是一個可行的選擇。

+0

沒有我仍然有同樣的結果,當一切都完成時我會得到輸出。 – user679135 2011-03-29 12:07:24

+0

你可以發佈你的代碼嗎? – pajton 2011-03-29 12:09:33

+0

我已經發布了它 – user679135 2011-04-01 13:02:08

相關問題