[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 14:05:34 ART 2011


El día 6 de abril de 2011 12:42, Daniel Moisset
<dmoisset en machinalis.com> escribió:
> 2011/4/6 Dario Ocles <dario.ocles en gmail.com>:
>> 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)
>
> Acá, agrega un sys.stdout.flush()
> Eso va a hacer que no se bufferee la salida
>

Clah! No se porque no se me cruzo probar esto :S.


>> 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.
>
> El tema es que si el script esta buffereando, no esta escribiendo en
> stdout (entonces no importa que es lo que hagas en el otro proceso,
> nunca vas a leer datos que todavia no se escribieron)
>

Con lo que dijiste anda perfecto. Con una script de prueba me anda
joya, pero cuando lo aplique al proceso real se comporta medio raro,
debo tener alguna otra cosa que este jodiendo. Me pasa que lee y no
lee... es aleatorio y a veces (espero 8 lineas y me lee 2 o nada o 6 o
todas... medio raro).

> Saludos,
>    D.
>
>> 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.
>
> Si queres hacer algo un poquito mas interactivo, fijate que en django
> hay formas de devolver un file-like en una respuesta, y eso va
> streameando la salida.
>

Voy a investigar :) . Si no me equivoco la idea es que vaya cargando
el stdout en el navegador a medida que se va escribiendo, verdad?

> Ademas si tenes un objeto asi de global, ojo con la concurrencia, en
> particular si lo modificas
>

Si, esto lo tengo claro. En mi caso no me jode porque es un proceso
que lo maneja una sola persona, pero de todas formas solo lo accedo
con el usuario que lo lanza con unas validaciones.

> Saludos,
>   D.
>

Muchas gracias!

Saludos.



More information about the pyar mailing list