2011-05-24 38 views
1

我正在使用Twisted Python服務器封裝Minecraft服務器應用程序,該服務器具有用於獲取當前連接播放器列表的RESTful API。 Twisted應用程序通過reactor.spawnProcess()啓動Minecraft服務器,然後通過ProcessTransport進行通信,寫入標準輸入。讀取標準輸出和標準輸入由一個單獨的protocol.ProcessProtocol類處理。扭曲的Python + spawnProcess。從命令獲取輸出

鑑於我希望得到一個非常具體的命令(以下簡稱「名單」命令,該命令將返回類似這樣的結果:

[INFO] Connected players: blah, blah2 

如果我能夠挑選出在標準輸出球員名單線,請問如何將這個提交到RESTful API視圖的最佳方式是要求提供連接球員列表?請記住,我的stdout reader無法直接與function that is trying to get the list of connected players通信。我可以解析stdout並確定要交付的球員列表,我只是不確定如何將其發送到Web API視圖,該視圖將連接的播放列表發送到客戶端,因爲視圖和標準輸出讀取器沒有直接聯繫。

我有一些可行的辦法來解決這個問題,但是如果任何人有想法,可以這樣做「正確的方式」。

回答

3

首先,不要撥打writeSomeData有史以來。致電write。其次,擁有一個全局協議實例可能是一個壞主意,因爲全局通常都是一個糟糕的主意。

第三,在ProcessProtocol子類中添加一個方法來獲取所需的信息。該協議的工作就是知道如何將抽象動作(例如「請求播放列表」)轉換爲字節序列來傳輸,以及如何將接收到的字節序列轉化爲抽象動作,如「過程告訴我這些播放器已連接」。

class NotchianProcessProtocol(protocol.ProcessProtocol): 
    ... 
    def listPlayers(self): 
     self.transport.write("list") 
     self._waiting.append(Deferred()) 
     return self._waiting[-1] 

    def outReceived(self, bytes): 
     outbuffer = self.outbuffer + bytes 
     lines, leftover = parseLines(outbuffer) 
     self.outbuffer = leftover 

     for line in lines: 
      if line.startswith('[INFO] Connected players: '): 
       self._waiting.pop(0).callback(line) 

現在,任何你的代碼具有參照連接NotchianProcessProtocol可以調用它listPlayers並取回一個Deferred將與連接播放信息火不久之後的。

+0

感謝您的幫助,我覺得有一些更好的方法來做到這一點。我的大腦仍然沒有完全包裹我們Twisted的回調,但這看起來很正確。 – Greg 2011-05-24 13:40:00

+0

哦,什麼是自我。等待?在翻閱文檔時沒有看到這一點。 – Greg 2011-05-24 13:41:50

+0

看起來像一個列表:)我遺漏了它的初始化 - 它是這個例子的一部分,但不是由Twisted或'ProcessProtocol'提供的。 – 2011-05-24 17:34:35