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