[pyar] comunicacion con un proceso

Matias Graña matias.alejo en gmail.com
Jue Feb 10 12:30:25 ART 2011


2011/2/10 Ale <peralta.alejandro en gmail.com>:
> El día 10 de febrero de 2011 10:51, Matias Graña
> <matias.alejo en gmail.com> escribió:
>> 2011/2/10 Roberto Alsina <ralsina en netmanagers.com.ar>:
>>> On 2/10/2011 10:14 AM, Matias Graña wrote:
>> $ cat lento
>> #!/bin/bash
>> for (( i=0; i<10; i++ )) ; do
>>        echo $i
>>        sleep 1
>> done
>
> El problema no es python, es tu program en bash que no está haciendo
> un flush del stdout, lo esta buffereando.
>
> Fijate que ./lento.sh | tail -f hace lo mismo...
>
> Tendrás que ver como hacer para que echo haga flush del stdout, o
> hacer el "lento" en python :-)

Me mareé. Ya no sé quién bufferea qué. Mi estado mental me dice sin
embargo que tail -f hace lo que hace porque busca alguna suerte de
EOF. Cambié el programa lento; le agregué una línea que escupe output
más grande:

#!/bin/bash
for (( i=0; i<20; i++ )) ; do
        seq -s " " 2000
        echo $i
        sleep 1
done

Con subprocess en python voy casi, casi, obteniendo dos líneas por
segundo (una del seq, otra del echo). En algunas vueltas, el buffer
hincha y se ven en pantalla dos vueltas juntas.
Por otra parte, con lento | tail -f el comportamiento es el mismo que
antes: espera al final y recién ahí tira las 10 últimas líneas.

Unbuffer (expect_unbuffer para Ubuntu) no me ayudó. Lo estoy usando en
el Popen: Popen('expect_unbuffer lento'.split(), stdin=blabla). No sé
si hay otra manera mejor.

Recapitulando:
estoy mejor que al comienzo; de hecho al comienzo también tenía un
posible problema de buffereo en el write al archivo de salida. Pero:
hay alguna manera de evitar los buffers? Yo esperaba que en Popen
utilizando bufsize=distintos_valores lo pudiera resolver. Pero no.

Roberto, Ale: gracias!
Matías



More information about the pyar mailing list