[pyar] comunicacion con un proceso

Matias Graña matias.alejo en gmail.com
Jue Feb 10 10:51:48 ART 2011


2011/2/10 Roberto Alsina <ralsina en netmanagers.com.ar>:
> On 2/10/2011 10:14 AM, Matias Graña wrote:
>>
>> Tengo un Thread que lanza un proceso en mi máquina, con
>> subprocess.Popen(proceso, stdout=subprocess.PIPE, stderr=un_archivo).
>> Lo hago así porque necesito capturar el stderr y empezar a hacer cosas
>> cuando en el stderr aparece una línea determinada. En este momento,
>> levanto el proceso y voy leyendo repetidas veces el archivo de stderr
>> hasta que aparece la línea. Estoy 104% seguro de que no es la mejor
>> forma de hacer esto; imagino que con sockets debería poder andar
>> mejor. Pero nunca usé sockets y no acierto a encontrar el ejemplo
>> adecuado para mi caso. O, quizás, sockets no es la respuesta.
>>
>> Creo que la pregunta tácita quedó clara. Espero.
>
> Lo que queres es leer el stderr, no mandarlo a un archivo.
>
> http://docs.python.org/library/subprocess.html#replacing-os-popen-os-popen2-os-popen3

Antes que nada: gracias! Muy posiblemente sea esto lo que quiero, sí.
Pero tengo un problema con algún flush. Ejemplo de juguete:

$ cat lento
#!/bin/bash
for (( i=0; i<10; i++ )) ; do
        echo $i
        sleep 1
done

Y en python, luego de importar subprocess,

>>> def n():
	p = subprocess.Popen('lento', stdout=subprocess.PIPE,
stderr=subprocess.PIPE, stdin=subprocess.PIPE, bufsize=0)
	so = p.stdout
	for line in so:
		print line

>>> n()

Yo esperaría que esto vaya tirando los números del 0 al 9 a razón de
uno por segundo (como hace el comando 'lento' original). Pero no,
espera 10 segundos y luego imprime todos juntos. Cómo hago para verlos
a medida que van saliendo?

Matías



More information about the pyar mailing list