[Python-es] subprocess.popen, capturar stdout :)

Oswaldo Hernández listas en soft-com.es
Vie Nov 2 18:44:38 CET 2007


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.
Tampoco habia utilizado el lock de las threads por lo que no tengo muy claro si lo hecho correctamente.


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")


-- 
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************


Más información sobre la lista de distribución Python-es