Python 创建自定义sys.stdout类?

Python 创建自定义sys.stdout类?,python,stdout,Python,Stdout,我试图做的只是将一些终端命令的输出打印到wx.TextCtrl小部件。我认为实现这一点最简单的方法是创建一个自定义stdout类,并将write函数重载为小部件的函数 标准等级: class StdOut(sys.stdout): def __init__(self,txtctrl): sys.stdout.__init__(self) self.txtctrl = txtctrl def write(self,string):

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

标准等级:

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
回溯(最近一次呼叫最后一次):
文件“mainwindow.py”,第12行,在
从systemconsole导入systemconsole
文件“systemconsole.py”,第4行,在
类标准输出(系统标准输出):
TypeError:调用元类基时出错
file()参数2必须是字符串,而不是元组

任何解决此问题的想法都将不胜感激。
sys.stdout=stdout(createdTxtCtrl)
是否会创建循环依赖关系?尝试不要将
sys.stdout
重新分配给从
sys.stdout
sys.stdout
派生的类。stdout不是一个
,它是一个实例(类型
文件

所以,只要做:

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

sys.stdout = StdOut(the_text_ctrl)
无需继承
文件
,只需制作一个像这样的简单文件对象!鸭子是你的朋友


(请注意,在Python中,与大多数其他OO语言一样,但与Javascript不同的是,您只从类AKA types继承,从不从类/类型的实例继承;-)。

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


如果你需要用stdout做的只是把一些程序的输出直接放到那里,而不是把所有的东西都直接放到那里,不要改变
sys.stdout
,只要用你自己的类似文件的对象(
createdTxtCtrl
)实例化
子进程.Popen
,而不是
sys.stdout
,我试过这个,结果是:回溯(最后一次调用):OnNew subprocess.Popen('echo“Hello World!”,stdout=sys.stdout,shell=True)文件“C:\Python26\lib\subprocess.py”,第614行,init errread,errwrite)=self.\u get_句柄(stdin,stdout,stderr)文件“C:\Python26\lib\subprocess.py”,第734行,在_get_handles c2pwrite=msvcrt.get_osfhandle(stdout.fileno())AttributeError中:“stdout”对象没有属性“fileno”
子进程
可以执行用任何语言编写的程序(不仅仅是Python!),因此需要一个“真正的操作系统级文件”(即带有FD的文件,也称为fileno)--除了一个真正的OS级文件外,无法将任何内容传递为
subprocess.Popen的
stdout=
(幸运的是,包括
subprocess.PIPE
,它允许父进程接收子进程的输出——但是,子进程中的缓冲通常意味着这不是您想要的,因此我始终建议使用
pexpect
wexpect
)。您需要的不仅仅是
写入
,您还需要
刷新
,可能还需要其他一些,具体取决于如何使用它。