¿Creando una clase sys.stdout personalizada?

Lo que estoy tratando de hacer es simplemente hacer que la salida de algunos comandos de terminal se imprima en un widget wx.TextCtrl. Pensé que la forma más fácil de lograr esto es crear una clase de salida estándar personalizada y sobrecargar la función de escritura a la del widget.

clase stdout

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

Y luego haría algo como:

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

Lo que resulta es el siguiente error:

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

Cualquier idea para solucionar esto sería apreciada.

sys.stdout no es una class , es una instancia (de tipo file ).

Entonces, solo haz

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

No hay necesidad de heredar de un file , ¡simplemente haga un objeto similar a un archivo como este! Escribir pato es tu amigo …

(Tenga en cuenta que en Python, como en la mayoría de los otros lenguajes OO, pero a diferencia de Javascript, solo hereda de clases de tipos AKA, nunca de instancias de clases / tipos ;-).

Si todo lo que necesita implementar es escribir, no hay necesidad de definir una nueva clase. Simplemente use createdTxtCtrl lugar de StdOut(createdTxtCtrl) , porque el primero ya admite la operación que necesita.

Si todo lo que necesita hacer con stdout es dirigir la salida de algunos progtwigs allí, no dirigir todo tipo de cosas allí, no cambie sys.stdout , simplemente sys.stdout una instancia del subprocess.Popen sys.stdout con su propio objeto tipo archivo ( createdTxtCtrl ) en lugar de sys.stdout .

¿ sys.stdout = StdOut(createdTxtCtrl) crearía una dependencia cíclica? Intente no reasignar sys.stdout a la clase derivada de sys.stdout .