[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