Как перенаправить вывод консоли Python в QTextBox - PullRequest
3 голосов
/ 18 мая 2010

Я работаю над созданием графического интерфейса для перекомпиляции ядра Linux. Для этого мне нужно реализовать 4-5 команд Linux из Python. Я использую Qt как дизайнер GUI. Я успешно реализовал команды, используя os.system() call. Но вывод получается на консоли. Настоящая проблема в том, что вывод команды - это листинг, который занимает почти 20-25 минут непрерывной печати. Как мы можем перенести этот вывод консоли в текстовое поле, разработанное в Qt. Может ли кто-нибудь помочь мне реализовать операцию setSource() в Qt, используя source в качестве выходов консоли live.

Ответы [ 3 ]

6 голосов
/ 22 мая 2010
self.process = QProcess()
self.connect(self.process, SIGNAL("readyReadStdout()"), self.readOutput)
self.connect(self.process, SIGNAL("readyReadStderr()"), self.readErrors)
tarsourcepath="sudo tar xvpf "+ self.path1
self.process.setArguments(QStringList.split(" ",tarsourcepath))
self.process.start()



def readOutput(self):

    self.textBrowser2.append(QString(self.process.readStdout()))
    if self.process.isRunning()==False:
        self.textBrowser2.append("\n Completed Successfully")




def readErrors(self):
    self.textBrowser2.append("error: " + QString(self.process.readLineStderr()))

Это хорошо сработало для меня. спасибо всем.

1 голос
/ 18 мая 2010

Я в основном имею дело с wxPython, но является ли http://diotavelli.net/PyQtWiki/Capturing_Output_from_a_Process решением, которое будет работать?

Со страницы:

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

Решение (одно из многих возможных): Создайте объект QProcess, подключите его сигналы на некоторые слоты в вашем классе, передать ему необходимые аргументы и Начни это. Данные о состоянии процесса и stderr доставляется в ваши слоты.

продолжение ...

0 голосов
/ 18 мая 2010

Использование трубы приходит на ум. Вы можете использовать фоновый поток, который читает выходные данные программы (и отправляет события в графический интерфейс всякий раз, когда добавляется новая строка).

Итак, основная идея такова:

os.chdir("/usr/src/linux-2.6.34")

p = os.popen("make", "r")
try:
    while True:
        line = p.readline()
        if not line:
            break

        # Replace this with a GUI update event (don't know anything about Qt, sorry)
        print line
finally:
    # Cf. http://docs.python.org/library/os.html#os.popen
    programReturnValue = p.close() or 0
...