创建自定义sys.stdout类?

时间:2010-02-19 16:35:42

标签: python stdout

我要做的只是让一些终端命令的输出打印到wx.TextCtrl小部件。我认为最简单的方法是创建一个自定义的stdout类,并将write函数重载到widget的那个。

stdout class:

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

任何解决这个问题的想法都会受到赞赏。

3 个答案:

答案 0 :(得分:13)

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中,与大多数其他OO语言一样,但与Javascript不同,您只能从类/类型的实例继承AKA类,从不; - 。)

答案 1 :(得分:0)

如果您需要实现的只是编写,则根本不需要定义新类。只需使用createdTxtCtrl代替StdOut(createdTxtCtrl),因为前者已经支持您需要的操作。

如果您需要使用stdout只是指向某些程序的输出,而不是指向那里的所有类型的东西,请不要更改sys.stdout,只需使用您自己的文件实例化subprocess.Popen - 喜欢对象(createdTxtCtrl)而不是sys.stdout

答案 2 :(得分:-1)

sys.stdout = StdOut(createdTxtCtrl)不会产生周期性依赖吗?请勿尝试将sys.stdout重新分配给从sys.stdout派生的类。