[英]Streaming stdin/stdout in Python
我正在嘗試將bash shell流式傳輸到簡單的WebSockets UI,但是我無法重定向IO。 我想啟動一個bash實例,並將stdout和stdin連接到與我的Web UI交互的write_message()和on_message()函數。 這是我正在嘗試做的簡化版本:
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)
雖然bash似乎開始並且on_message確實被調用,但我沒有得到任何輸出。 readline()仍然阻塞。 我已經嘗試過stdout.read(),stdout.read(1)和各種緩沖區修改,但仍然沒有輸出。 我還嘗試使用on_message中的尾部'\\ n'來編寫硬編碼命令以隔離問題,但我仍然沒有從readline()獲得任何輸出。
理想情況下,我希望實時流式傳輸寫入stdout的每個字節,而無需等待EOL或任何其他字符,但我很難找到合適的API。 任何指針將不勝感激。
它看起來像我的線:
line = self.app.stdout.readline()
將阻止ioloop運行,因為應用程序將花費大部分時間掛在readline()
等待應用程序寫入一些輸出。 要使這個工作,你將不得不得到進程的stdin
和stdout
(以及stderr
怎么樣? - 你也需要捕獲它),將它們切換到非阻塞模式,然后將它們添加到ioloop
花費時間循環的ioloop
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.