2013-05-27 2 views
1

Я пытаюсь получить то, что записано в stdout в подпроцессе, отображаемом в виджетах Qt.получить stdout подпроцесса, который будет отображаться в виде виджета Qt

Я начала процесса таким образом:

import subprocess 

subprocess.call(["program_name", "arguments"]) 

Я думаю, что я должен сделать класс действовать как стандартный вывод, и указать его, когда я называю подпроцесс, я попытался это:

class Log: 
    def __init__(self, qtWidget): 
     self.qtWidget = qtWidget 

    def write(self, data): 
     self.qtWidget.append(data) 


# (...) 

log = Log(theWidget) 

sub.process.call(["program_name", "arguments"], stdout=log) 

, но я получаю сообщение об ошибке сказав: AttributeError: объект «Журнал» не имеет атрибута «fileno»

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

[править]

Законченное с этим:

process = QProcess() 
process.setProcessChannelMode(QProcess.MergedChannels) 
process.start("program_name", [ "arguments" ]) 
process.readyReadStandardOutput.connect(aFunction) 


# then in the function... 

outputBytes = process.readAll().data() 
outputUnicode = outputBytes.decode('utf-8') 
messageWidget.append(outputUnicode) 

спасибо за помощь!

ответ

1

Перенаправление потоков ввода/вывода в модуле подпроцесса работает на более низком уровне, поэтому вы можете передавать только файлы-файлы, имеющие fileno.

Если вы хотите, чтобы прочитать данные из питона, вы можете использовать либо subprocess.check_output вместо subprocess.call, который будет возвращать данные, записанные в стандартном вывод текущего процесса в байтах:

log = subprocess.check_call(["program_name", "arguments"]) 
... # use log 

Или вы можете использовать subprocess.Popen и пропуска stdout=subprocess.PIPE. После этого вы можете прочитать данные из возвращенного Objets-х stdout:

p = subprocess.Popen(["program_name", "arguments"], stdout=subprocess.PIPE) 
log = subprocess.stdout.read() 
... # use log 

Там должно быть много примеров в документации подпроцесса.


Edit:

Если вам нужна более тесная интеграция с Qt, вы можете также использовать QProcess начать вместо вашей программы модуля подпроцесса. Это позволит вам использовать сигнал ReadyRead канала чтения, чтобы получать уведомления, когда данные готовы к чтению из процесса.

+0

Я закончил с использованием QProcess и прослушивал сигнал readyReadStandardOutput. Это хорошо работает, спасибо! – drk