Python中的流式stdin/stdout

Python中的流式stdin/stdout,python,websocket,tornado,Python,Websocket,Tornado,我试图将bashshell流式传输到一个简单的WebSockets用户界面,但重定向IO时遇到问题。我想启动一个bash实例,并连接stdout和stdin来编写与我的web UI交互的_message()和_message()函数。下面是我尝试做的一个简化版本: class Handler(WebSocketHandler): def open(self): print "New connection opened." self.app = subpro

我试图将bashshell流式传输到一个简单的WebSockets用户界面,但重定向IO时遇到问题。我想启动一个bash实例,并连接stdout和stdin来编写与我的web UI交互的_message()和_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_消息确实被调用了,但我没有得到任何输出。readline()仍处于阻塞状态。我尝试了stdout.read()、stdout.read(1)和各种缓冲区修改,但仍然没有输出。我还尝试过在on_消息中使用结尾的“\n”对命令进行硬编码以隔离问题,但我仍然没有从readline()获得任何输出


理想情况下,我希望实时传输写入标准输出的每个字节,而不等待EOL或任何其他字符,但我很难找到正确的API。任何指点都将不胜感激。

在我看来,这就像一行:

line = self.app.stdout.readline()

将阻止ioloop运行,因为应用程序的大部分时间将挂起在
readline()
中,等待应用程序写入一些输出。要使其工作,您必须获取流程的
stdin
stdout
(以及
stderr
?-您也需要捕获它),将它们切换到非阻塞模式,并将它们添加到
ioloop
花时间循环的文件描述符集中。

刷新流有帮助吗?没有,我甚至尝试用sys.stdout.flush()替换bash,用一个简单的echo脚本。这个WebSocketHandler是什么?@ChrisMorgan它来自Tornado。你的帖子让我阅读了非阻塞IO策略,我能让它工作。谢谢伟大的我担心我的回答过于简短而无济于事,我很高兴这足以让您了解异步,从而解决整个问题。如果有机会,请编辑您的问题,并添加一点“这是解决方案的样子”部分,以便稍后遇到此问题的人可以看到完全解决的异步循环的样子。