capturar salida consola

David Villa dvilla en gmx.net
Mie Feb 9 19:54:17 CET 2005


Hola:

Prueba con esto:

#------
import os, sys, time

def hijo():
   print 1
   time.sleep(2)
   print 2
   time.sleep(2)
   os.execl('/bin/ls', '')
   

pipe_r, pipe_w = os.pipe()
value = os.fork()

if value == 0:
   print 'Proceso hijo'
   
   os.close(pipe_r)
   os.dup2(pipe_w, 1)

   hijo()

   
print 'Proceso padre'
os.close(pipe_w)

while(1):
   txt = os.read(pipe_r, 100)
   if not txt: break
   print txt,

#---

Con esto vas obteniendo la entrada conforme se produce pero es mucho más
largo y más feo que popen().

lo curioso del asunto es que si cambias este último while por:

for i in os.fdopen(pipe_r, 'r', 1):
   print i,

también se comporta como con popen(), es decir, obtiene toda la entrada
de una vez y al final. Supongo que si se utiliza un descriptor de
fichero en lugar de un "FILE" se obtiene la entrada en modo crudo, creo
que tiene que ver más con la gestión de la entrada/salida que con el
hecho de usar popen() o pipe(), más que nada porque popen() llama a
pipe() :-)
No me acaba de quedar muy claro porqué sucede esto. ¿Habría que poner la
entrada en modo crudo? ¿Alguien conoce un modo más elegante de conseguir
este comportamiento?

Saludos






El mié, 09-02-2005 a las 11:40 +0100, Felipe Botet escribió:
> Hola Marcos,
> pues sí, he leído este hilo y me ayudó, pero efectivamente solo salía
> la salida al final.
> 
> 
> On Wed, 09 Feb 2005 11:09:17 +0100, Marcos Sánchez Provencio
> <rapto en arrakis.es> wrote:
> > Hace poco se puso un ejemplo con cdrecord, me imagino que será parecido.
> > ¿O en el ejemplo se recogía la salida de golpe al final?
> > 
> > El mié, 09-02-2005 a las 00:21 +0100, Felipe Botet escribió:
> > > Hola,
> > > este es mi primer mensaje a la lista, así que saludos a todos.
> > > Mi pregunta es, posiblemente, simple, pero no encuentro respuesta por
> > > otros medios (google, tutorial pygtk, etc). Necesito lanzar un comando
> > > desde una aplicación pygtk y capturar su salida por consola a medida
> > > que se produzca y redirigirla a un textview, sin esperar a que
> > > concluya su trabajo, puesto que podría demorarse mucho.
> > > Concretamente el comando es "os.system('dpkg -i paquete.deb')".
> > > Alguien podria indicarme cómo hacerlo?
> > > gracias.
> > > _______________________________________________
> > > Python-es mailing list
> > > Python-es en aditel.org
> > > http://listas.aditel.org/listinfo/python-es
> > --
> > Marcos Sánchez Provencio <rapto en arrakis.es>
> > 
> > 
> > _______________________________________________
> > Python-es mailing list
> > Python-es en aditel.org
> > http://listas.aditel.org/listinfo/python-es
> > 
> > 
> >
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es
> 




Más información sobre la lista de distribución Python-es