2010-02-19 133 views
6

我想要做的只是輸出一些終端命令到wx.TextCtrl小部件。我認爲最簡單的方法就是創建一個自定義的stdout類,並將寫入函數重載到該部件的寫入函數。創建一個自定義的sys.stdout類?

標準輸出類:

class StdOut(sys.stdout): 
    def __init__(self,txtctrl): 
     sys.stdout.__init__(self) 
     self.txtctrl = txtctrl 

    def write(self,string): 
     self.txtctrl.write(string) 

然後,我會做一些如:

sys.stdout = StdOut(createdTxtCtrl)  
subprocess.Popen('echo "Hello World!"',stdout=sys.stdout,shell=True) 

什麼結果是以下錯誤:

Traceback (most recent call last): 
File "mainwindow.py", line 12, in <module> 
from systemconsole import SystemConsole 
File "systemconsole.py", line 4, in <module> 
class StdOut(sys.stdout): 
TypeError: Error when calling the metaclass bases 
file() argument 2 must be string, not tuple 

任何想法解決這個問題會不勝感激。

回答

11

sys.stdout一個class,它是一個實例file類型)。

所以,只是做:

class StdOut(object): 
    def __init__(self,txtctrl): 
     self.txtctrl = txtctrl 
    def write(self,string): 
     self.txtctrl.write(string) 

sys.stdout = StdOut(the_text_ctrl) 

無需從file繼承,只是做一個簡單的類似文件的對象是這樣! 鴨打字是你的朋友?

(請注意,在Python中,像大多數其他面嚮對象語言不同,但是從Javascript,你永遠只能從類AKA類型繼承,從未實例類/類型 ;-)。

+3

我嘗試這樣做,這導致: 回溯(最近通話最後一個): '! 「Hello World」 的回聲' 文件 「blade_gui.py」,線路179,在OnNew subprocess.Popen(,標準輸出= sys.stdout,shell = True) 文件「C:\ Python26 \ lib \ subprocess.py」,行614,在__init__中 errread,errwrite)= self._get_handles(stdin,stdout,stderr) 文件「C: \'Python26 \ lib \ subprocess.py「,第734行,在_get_handles c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) AttributeError:'StdOut'對象沒有'fileno'屬性 – Duck 2010-02-19 17:22:38

+2

'subprocess'可以執行寫入的程序任何語言(不只是Python!),所以需要一個「真正的操作系統級文件」(即。,一個帶有FD,也稱爲fileno) - 除了一個真正的OS級文件(包括幸運的是,子進程)外,沒有辦法將任何東西作爲subprocess.Popen的'stdout ='傳遞。PIPE',它可以讓你的父進程接收子進程的輸出 - 但是,在子進程中的緩衝通常意味着這不是你想要的,所以我總是建議使用'pexpect'或'wexpect'來代替)。 – 2010-02-19 19:03:06

+2

你需要的不僅僅是'write',你還需要'flush',也許一些其他的取決於它的使用方式。 – SimplyKnownAsG 2014-06-03 06:02:39

-1

不會sys.stdout = StdOut(createdTxtCtrl)創建週期性依賴關係?儘量不要將sys.stdout重新分配給派生自sys.stdout的類。

0

如果您需要實現的只是書寫,則根本沒有必要定義一個新類。只需使用createdTxtCtrl而不是StdOut(createdTxtCtrl),因爲前者已經支持您所需的操作。

如果你需要用標準輸出做的是直接的一些程序輸出那裏,不是直接的各種東西在那裏,不改變sys.stdout,只是實例化subprocess.Popen用自己的類文件對象(createdTxtCtrl)代替sys.stdout

相關問題