capturar salida consola
Marcos Sánchez Provencio
rapto en arrakis.es
Mie Feb 16 18:36:38 CET 2005
A ver esto:
#!/usr/bin/env python
"""Mostrar la salida de una orden externa en un control gtk.TextView
sin
bloquear la Interfaz de Usuaria"""
import os, 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):
generator = read_output(buffer, command)
gtk.idle_add(generator.next)
def read_output(buffer, command):
stdin, stdouterr = os.popen4(command)
for line in stdouterr:
buffer.insert(buffer.get_end_iter(), utf8conv(line))
yield True
yield False
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()
El mar, 15-02-2005 a las 20:23 +0100, Rafael Villar Burke escribió:
> 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
Más información sobre la lista de distribución Python-es