subprocess.popen, capturar stdout :)
tny
a.porrua en gmail.com
Vie Nov 2 19:05:07 CET 2007
El vie, 02-11-2007 a las 18:44 +0100, Oswaldo Hernández escribió:
> tny escribió:
>
> >
> > ¿Con hilos?
> > un hilo para stdin y otro para stderr que lancen eventos cuando reciben
> > datos, y el hilo principal con un loop a la espera dichos eventos.
> >
>
> Creo que has dado con la solución a la lectura de ambos pipes simultáneamente :)
>
> Estoy viendo los eventos de las threads y no me aclaro mucho con ellos, asi que la prueba la he
> realizado utilizando un callback.
jejej, a eso me refería... es que yo en mi ignorancia lo llamo
eventos...
> Tampoco habia utilizado el lock de las threads por lo que no tengo muy claro si lo hecho correctamente.
Sólo he empleado hilos en un proyecto, y no utilicé threading si no
thread.
Con thread hubiera empleado una variable global como lock o la hubiera
pasado como parámetro. Pero con thrading me parece que has hecho lo más
correcto, usar un método de la clase, que como tal comparten todas las
instancias.
> import subprocess
> import threading
>
> def runapp(app):
> pr = subprocess.Popen(app.split(), stdin=None, stdout = subprocess.PIPE, stderr=subprocess.PIPE)
>
> # lanzar treads
> tout = readfile(pr.stdout, "StdOut", analizadatos)
> terr = readfile(pr.stderr, "StdErr", analizadatos)
> tout.start()
> terr.start()
>
> pr.wait()
> print "finalizado con codigo %s" % pr.poll()
>
> def analizadatos(pipa, msg):
> print "%s:%s" % (pipa, msg)
>
> class readfile(threading.Thread):
> lck = threading.Lock()
> def __init__(self, file, pipa, callback):
> threading.Thread.__init__(self)
> self.file = file
> self.pipa = pipa
> self.callback = callback
> def run(self):
> while 1:
> msg = self.file.readline()
> if not msg:
> break
> #bloquear, ejecutar funcion y desbloquear
> self.lck.acquire()
> self.callback(self.pipa, msg)
> self.lck.release()
>
>
> runapp("ping www.google.es")
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes
Más información sobre la lista de distribución Python-es