capturar salida consola

Felipe Botet felipebt en gmail.com
Mie Feb 16 18:19:15 CET 2005


Hola,
pues la verdad es que tu método es el único que me queda por probar a
fondo, pero soy pesimista. En consola funcionan todos, es decir,
puedes recoger en una variable las líneas de salida del stdout y
imprimirlas una a una a medida que se producen.
Por eso decía que el único camino que yo veo posible es transferir la
terminal antes de ejecutar el comando y luego devolverlo.
Si ejecutas el comando a través de un button_clicked, por ejemplo,
pygtk no transfiere el foco a otro objeto (el textview, en este caso)
en tanto no haya terminado la ejecución del comando, y claro esto
puede tardar bastante. Por eso os ponía el ejemplo del synaptic y del
xcdroast.
Estas son mis impresiones, y lo digo más desde la lógica que desde mis
conocimientos de programación en python, que como os dije, son escasos
y recientes.
Seguiremos investigando :)


On Wed, 16 Feb 2005 09:36:22 +0100, David Villa <dvilla en gmx.net> wrote:
> 
> Hola:
> 
> Lo has intentado con las pipe() como yo dije? No lo he probado con GTK,
> pero en consola funciona sin problema.
> 
> Saludos
> 
> El mié, 16-02-2005 a las 00:57 +0100, Felipe Botet escribió:
> > hola,
> > yo lo he intentado con un código parecido al tuyo (con popen4), con
> > pexpect, etc y el resultado siempre es el mismo: escribe en el
> > textview cuando acaba el comando a ejecutar.
> > Creo que lo que se debería hacer es transferir la salida del terminal
> > antes de ejecutar el comando y después recuperarlo de nuevo. Algo así
> > como lo que hace el synaptic o el xcdroast por poner dos ejemplos
> > conocidos. Pero claro, yo hasta ahí no llego.
> > Muchas gracias por tu intento.
> >
> >
> > On Tue, 15 Feb 2005 20:23:52 +0100, Rafael Villar Burke
> > <pachi en mmn-arquitectos.com> wrote:
> > > Felipe Botet wrote:
> > >
> > > >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.
> > > >
> > > Ya te han ido contestando en la lista, pero he estado intentando
> > > resolver el problema sin usar hilos, con select.select() con pipes,
> > > evitando el bloqueo de la E/S hasta el final de la ejecución y vigilando
> > > la salida del proceso externo con gobject.add_io_watch(), pero parece
> > > que no tengo éxito y la solución no es para nada portable (aunque en tu
> > > caso parece importar poco), debido a que en Win32 las tuberías no
> > > soportan la API tradicional de select y no se pueden poner en modo de
> > > no-bloqueo...
> > >
> > > He dejado la solución de abajo en la FAQ de pygtk en la entrada 14.23
> > > (http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq14.023.htp),
> > > a la espera de que alguien más espabilado resuelva esto sin hilos :).
> > >
> > > ------------
> > >
> > > #!/usr/bin/env python
> > > """Mostrar la salida de una orden externa en un control gtk.TextView sin
> > > bloquear la Interfaz de Usuaria"""
> > >
> > > import os, threading, locale
> > >
> > > import pygtk
> > > pygtk.require('2.0')
> > > import gtk
> > >
> > > encoding = locale.getpreferredencoding()
> > > utf8conv = lambda x : unicode(x, encoding).encode('utf8')
> > >
> > > def on_button_clicked(button, buffer, command):
> > >     thr = threading.Thread(target= read_output, args=(buffer, command))
> > >     thr.run()
> > >
> > > def read_output(buffer, command):
> > >     stdin, stdouterr = os.popen4(command)
> > >     for line in stdouterr.readlines():
> > >         buffer.insert(buffer.get_end_iter(), utf8conv(line))
> > >
> > > sw = gtk.ScrolledWindow()
> > > sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
> > > textview = gtk.TextView()
> > > textbuffer = textview.get_buffer()
> > > sw.add(textview)
> > > win = gtk.Window()
> > > win.resize(300,500)
> > > win.connect('delete-event', gtk.main_quit)
> > > button = gtk.Button(u"¡Púlsame!")
> > > command = 'dir -R %s' % os.getcwd()
> > > button.connect("clicked", on_button_clicked, textbuffer, command)
> > > vbox = gtk.VBox()
> > > vbox.pack_start(button, gtk.FALSE)
> > > vbox.pack_start(sw)
> > > win.add(vbox)
> > > win.show_all()
> > >
> > > gtk.main()
> > >
> > > ----------
> > >
> > > Saludos,
> > >
> > > Pachi
> > > _______________________________________________
> > > 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
> >
> 
> _______________________________________________
> 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