在Python中流式传输stdin/stdout



我试图流bash shell到/从一个简单的WebSockets UI,但我有麻烦重定向IO。我想启动一个bash实例,并将stdout和stdin连接到write_message()和on_message()函数,与我的web UI交互。下面是我要做的事情的简化版本:

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()中获得任何输出。

理想情况下,我想流每个字节写入标准输出实时,而不是等待EOL或任何其他字符,但我很难找到合适的API。

在我看来就像这样:

line = self.app.stdout.readline()

将阻止iolloop运行,因为应用程序将花费大部分时间挂在readline()中等待应用程序写一些输出。为了使它工作,你必须得到过程中的stdinstdout(那么stderr呢?-你也需要捕获它),将它们切换到非阻塞模式,并将它们添加到ioloop花费时间循环的文件描述符集。

相关内容

  • 没有找到相关文章

最新更新