[pyar] Leer stdout de un proceso que lanzo con subprocess.Popen sin bloquear el script

Dario Ocles dario.ocles en gmail.com
Mie Abr 6 12:15:03 ART 2011


Buenas gente, tengo el siguiente problema.

Tengo un proceso que puede o no tardar mucho. El script lo único que
hace es procesar una cantidad de archivos y por cada archivo que ya
proceso imprime en el stdout "El archivo X termino bien".
A medida que va imprimiendo que termino con el archivo X tengo que
mostrarlo en una pagina web.

La pagina web obviamente consulta que archivos fueron consultados cada
X segundos.

El problema que tengo es que cada vez que intento leer el stdout del
proceso esta lectura se clava hasta que termina todo el proceso, que
no me sirve.

Doy un ejemplo de juguete:

uno.py
import sys
from time import sleep

for n in range(5):
    sys.stdout.write("termino %d\n" % n)
    sleep(5)


dos.py
import subprocess
process = subprocess.Popen(['a.py'], stdout=subprocess.PIPE)
process.stdout.read(8) # Se bloquea hasta que termina el script


Lo que quiero es que una vez lanzado cuando leo el stdout me devuelva
todo lo que se escribió sin que bloquee el script hasta que se termine
el proceso.

Probe con:
process.stdout.readline()
process.stdout.readlines()
os.read(process.stdout.fileno(), 8)
process.comunicate()

Todo bloquea el flujo de este segundo script hasta que termine el que
lanzo con Popen.

Se les ocurre como hacer esto? Mi idea no es lanzar cada procesamiento
por separado y no todo en un script... tampoco empezar a hacer cosas
raras con Thread ni colas. Debe existir una forma de ir leyendo a
medida que se escribe en el stdout.

Desde ya muchas gracias.

PD: Por las dudas aclaro que esto no trabaja como en el ejemplo, estoy
trabajando con Django y lanzo el proceso desde un objeto que puedo
consultarlo desde cualquier request, lo que quiero en cada request es
ver lo que se escribió hasta el momento en el stdout... y ya como
chuchería solo consultar lo que se escribió desde la ultima vez que se
consulto, pero me da lo mismo cualquier de los dos.



More information about the pyar mailing list