2013-05-27 32 views
1

我想要寫入到某個子進程中的標準輸出中,顯示在Qt小部件中。獲取要顯示在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

子過程模塊中輸入/輸出流的重定向工作在較低的級別,這就是爲什麼您只能傳遞文件類型的文件沒有。

如果你想讀從蟒蛇的數據,您可以使用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 

應該有很多的子文檔中的例子。


編輯:

如果需要使用Qt的更緊密集成,你也可以使用QProcess啓動程序,而不是子模塊。這將允許您使用讀通道的readyRead信號,以便在數據準備好從流程中讀取時通知它。

+0

我結束了使用QProcess並收聽'readyReadStandardOutput'信號。它運作良好,謝謝! – drk

相關問題