我想要做的只是輸出一些終端命令到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
任何想法解決這個問題會不勝感激。
我嘗試這樣做,這導致: 回溯(最近通話最後一個): '! 「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
'subprocess'可以執行寫入的程序任何語言(不只是Python!),所以需要一個「真正的操作系統級文件」(即。,一個帶有FD,也稱爲fileno) - 除了一個真正的OS級文件(包括幸運的是,子進程)外,沒有辦法將任何東西作爲subprocess.Popen的'stdout ='傳遞。PIPE',它可以讓你的父進程接收子進程的輸出 - 但是,在子進程中的緩衝通常意味着這不是你想要的,所以我總是建議使用'pexpect'或'wexpect'來代替)。 – 2010-02-19 19:03:06
你需要的不僅僅是'write',你還需要'flush',也許一些其他的取決於它的使用方式。 – SimplyKnownAsG 2014-06-03 06:02:39