2010-02-19 29 views
6

Lo que intento hacer es simplemente imprimir el resultado de algunos comandos de terminal en un widget wx.TextCtrl. Pensé que la forma más fácil de lograr esto es crear una clase stdout personalizada y sobrecargar la función de escritura a la del widget.Creando una clase sys.stdout personalizada?

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 entonces me gustaría hacer algo como:

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

El resultado es el siguiente error:

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 

¿Alguna idea para solucionar este problema sería ser apreciado.

Respuesta

11

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

lo tanto, sólo lo hacen:

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 file, simplemente hacer un objeto de tipo fichero simple como esto! pato escribir es su amigo ...

(Tenga en cuenta que en Python, como la mayoría de otros lenguajes orientados a objetos, pero a diferencia de Javascript, para que sólo hereda de clases AKA tipos, Nunca de instancias de clases/tipos ;-).

+3

He intentado esto, y como resultado: Rastreo (llamada más reciente pasado): 'Hello World! "Eco' Archivo "blade_gui.py", línea 179, en OnNew subprocess.Popen (stdout = sys.stdout, shell = True) Archivo "C: \ Python26 \ lib \ subprocess.py", línea 614, en __init__ errread, errwrite) = self._get_handles (stdin, stdout, stderr) Archivo "C: \ Python26 \ lib \ subprocess.py ", línea 734, en _get_handles c2pwrite = msvcrt.get_osfhandle (stdout.fileno()) AttributeError: el objeto 'StdOut' no tiene ningún atributo 'fileno' – Duck

+2

' subprocess' puede ejecutar programas escritos en cualquier lenguaje (¡no solo Python!) y por eso necesita un "archivo de nivel de SO real" (es decir, ., uno con un FD, también conocido como fileno) - no hay forma de pasar nada como 'stdout =' de 'subprocess.Popen' excepto un archivo real del nivel del sistema operativo (incluyendo, afortunadamente,' subprocess.PIPE', que permite que el proceso principal reciba la salida del proceso secundario; sin embargo, el almacenamiento en el proceso secundario generalmente significa que no es lo que desea, por lo que siempre sugiero usar 'pexpect' o' wexpect' en su lugar). –

+2

necesita algo más que 'write', también necesita' flush', tal vez algunos otros dependiendo de cómo se usará. – SimplyKnownAsG

-1

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

0

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

Si todo lo que tiene que ver con la salida estándar es directa salida de algunos programas no, no dirigir todo tipo de cosas allí, no cambie sys.stdout, solo una instancia del subprocess.Popen con su propio objeto de fichero (createdTxtCtrl) en lugar de sys.stdout.

Cuestiones relacionadas