Графический интерфейс Python (glade) для отображения вывода процесса оболочки

Я пишу приложение Python, которое запускает несколько подпроцессов, используя объекты subprocess.Popen. У меня есть графический интерфейс Glade, и я хочу отображать выходные данные этих команд (работающих в subprocess.Popen) в графическом интерфейсе в режиме реального времени.

Может ли кто-нибудь предложить способ сделать это? Какой объект поляны мне нужно использовать и как перенаправить вывод?


person M0E-lnx    schedule 18.12.2009    source источник


Ответы (3)


Вот ссылка, которая также показывает другой способ сделать это.

Я нашел это очень проницательным, может быть, кто-то еще может использовать эти советы.

http://pygabriel.wordpress.com/2009/07/27/redirecting-the-stdout-on-a-gtk-textview/

person M0E-lnx    schedule 21.12.2009

После большого количества чтения и не получив желаемых результатов, я нашел другой метод, который работает.

Это происходит так

#!/usr/bine/env python
import subprocess
import gtk

### Of course, you should have the gui built and know which widgets to use for this.
viewer = self.builder.get_object('txtview')
proc = subprocess.Popen('ls -al /home'.split(), stdout=subprocess.PIPE, stderr = subprocess.STDOUT)
while True:
    line = proc.stdout.readline()
    viewer.get_buffer().insert_at_cursor(line)
    if not line:
       break
person M0E-lnx    schedule 21.12.2009

Glade — это всего лишь программа для создания графического интерфейса с помощью gtk, поэтому, когда вы запрашиваете glade object, возможно, вам следует запросить gtk widget, и в этом случае textbuffer и textview должны быть решением. или, может быть, древовидная структура и список. subprocess.Popen имеет аргументы stdout и stderr, которые могут принимать файлоподобный объект. вы можете создать адаптер, который записывает в текстовый буфер или добавлять элементы в список

person mg.    schedule 18.12.2009
comment
Я исправлен... Я имел в виду виджет gtk. Теперь об этом адаптере, можете ли вы предоставить более подробную информацию? Вы имеете в виду объект таймера, который постоянно читает stdout и stderr и записывает их в виджет gtk? или вы что-то другое имеете в виду? - person M0E-lnx; 18.12.2009
comment
я думал, что Popen записывает вывод в файл-объект, вместо этого он использует метод .fileno() и os.fdopen() для этого файлового дескриптора (и я не знаю, почему). поэтому вы можете использовать .communicate(), который считывает все выходные данные в памяти до тех пор, пока процесс не завершится. Если это не вариант для вас, вы должны использовать PIPE и постоянно читать из него (возможно, из потока). надеюсь, это помогло больше - person mg.; 18.12.2009