gpt4 book ai didi

python - 在 Python 中流式传输标准输入/标准输出

转载 作者:太空宇宙 更新时间:2023-11-03 11:09:42 25 4
gpt4 key购买 nike

我正在尝试将 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() 获得任何输出。

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

最佳答案

在我看来这行:

line = self.app.stdout.readline()

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

关于python - 在 Python 中流式传输标准输入/标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8190648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com