2011-11-18 152 views
4

我試圖從簡單的WebSockets UI流入/從一個bash shell,但我在重定向IO時遇到問題。我想啓動一個bash實例,並將stdout和stdin連接到與我的Web UI交互的write_message()和on_message()函數。這裏是什麼,我試圖做一個簡化版本:在Python中的流標準輸出/標準輸出

class Handler(WebSocketHandler): 
    def open(self): 
     print "New connection opened." 
     self.app = subprocess.Popen(["/bin/bash", "--norc", "-i"], stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False) 
     thread.start_new_thread(self.io_loop,()) 

    def on_message(self, message): 
     self.app.stdin.write(message) 

    def on_close(self): 
     self.app.terminate() 

    def io_loop(self): 
     while self.app.poll() is None: 
      line = self.app.stdout.readline() 
      if line: 
       self.write_message(line) 

雖然慶典似乎開始和ON_MESSAGE不會被調用,我沒有得到任何輸出。 readline()仍然阻塞。我試過stdout.read(),stdout.read(1)和各種緩衝區修改,但仍然沒有輸出。我也嘗試了在on_message中使用後綴'\ n'的硬編碼命令來隔離問題,但是我仍然沒有從readline()獲得任何輸出。

理想情況下,我希望將每個字節實時寫入stdout,而不等待EOL或任何其他字符,但我很難找到正確的API。任何指針將不勝感激。

+0

沖洗流幫助嗎? –

+0

不,我甚至嘗試用sys.stdout.flush()替換一個簡單的echo腳本。 – ca4221

+0

這是什麼WebSocketHandler? –

回答

3

這在我看來像行:

line = self.app.stdout.readline() 

將阻止ioloop運行,因爲應用程序將花費其大部分時間在readline()掛了等待寫一些輸出,而不是應用程序。爲了得到這個工作,你將不得不得到stdinstdout的過程(以及stderr? - 你也需要捕獲它),將它們切換到非阻塞模式,並將它們添加到文件描述符ioloop花費其時間循環。

+1

您的帖子讓我讀到了非阻塞IO策略,並且我能夠使用[asyncproc](http://www.lysator.liu.se/~bellman/download/asyncproc.py)來處理它。謝謝! – ca4221

+0

太棒了!我擔心我的回答太短暫無法提供幫助,很高興能夠讓您瞭解關於異步的知識,以便您可以解決整個問題。如果你有機會,編輯你的問題,並添加一些「這裏是解決方案的樣子」部分,以便稍後遇到這個問題的人可以看到完整的異步循環是什麼樣的。 –