簡體   English   中英

在Python中流式傳輸stdin / stdout

[英]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()等待應用程序寫入一些輸出。 要使這個工作,你將不得不得到進程的stdinstdout (以及stderr怎么樣? - 你也需要捕獲它),將它們切換到非阻塞模式,然后將它們添加到ioloop花費時間循環的ioloop

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM