capturar salida consola

David Villa dvilla en gmx.net
Mie Feb 16 09:36:22 CET 2005


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
> 




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