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

Dario Ocles dario.ocles en gmail.com
Jue Abr 7 11:03:39 ART 2011


El día 6 de abril de 2011 18:55, Claudio Freire
<klaussfreire en gmail.com> escribió:
> 2011/4/6 Dario Ocles <dario.ocles en gmail.com>:
>> 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.
>
> La lectura por file objects es bloqueante.
>
> Tenés tres opciones:
>
> 1. Usar threads, hacer que un thread en background vaya leyendo y
> poniendo lo que lee en algún lugar de donde tu aplicación pueda
> consultarlo rápidamente sin bloquear.
> 2. Usar asio para hacer entrada/salida no bloqueante - con fcntl.ioctl
> podés poner al file descriptor en modo no bloqueante
> 3. Usar fcntl.ioctl para preguntar si hay datos que leer antes de
> intentar leerlos
>

Bueno, para que quede registro les paso como debería quedar para que
el ejemplo ande con fcntl [0].

Al final no creo que lo use en mi proceso y seguramente use Thread
porque voy a necesitar que corran muchos al mismo tiempo.

Estuve intentando entender que es lo que hace esto exactamente
(internamente digo), pero no encontré nada que lo explique o lo que
encontré no lo entendí. A grandes rasgos alguien me puede explicar
como trabaja esto?

Saludos.

[0]

#uno.py
import sys
from time import sleep

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

-------------------------------

#dos.py
import subprocess
import fcntl
from time import sleep
process = subprocess.Popen(['a.py'], stdout=subprocess.PIPE)
fcntl.fcntl(process.stdout, fcntl.F_SETFL, os.O_NONBLOCK)
while process.poll() is None:
    try:
        print process.stdout.readline()
    except IOError:
        sleep(0.5)



More information about the pyar mailing list