繁体   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