【发布时间】:2020-08-18 08:49:54
【问题描述】:
如何将标准输出从子进程传送到 websocket 而无需等待换行符? 目前,以下代码仅在换行符上发送标准输出。
为子进程运行的脚本附加的代码。是否没有从那里正确刷新输出?
send_data.py:
import asyncio
import websockets
import subprocess
import sys
import os
async def foo(websocket, path):
print ("socket open")
await websocket.send("successfully connected")
with subprocess.Popen(['sudo','python3', '-u','inline_print.py'],stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=0, universal_newlines=True) as p:
for line in p.stdout:
line = str(line.rstrip())
await websocket.send(line)
p.stdout.flush()
for line in p.stderr:
line = str(line.rstrip())
await websocket.send(line)
p.stdout.flush()
start_server = websockets.serve(foo, "localhost", 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
inline_print.py:
from time import sleep
import sys
loading = 'LOADING...LOADING...LOADING...LOADING...LOADING...'
for i in range(50):
print(loading[i], sep='', end=' ', flush=True)
sleep(0.1)
如果将end=' ' 更改为end='\n',则来自send_data.py 的标准输出会实时发生。
js 客户端:
var ws = new WebSocket('ws://localhost:8765/');
ws.onmessage = function(event) {
console.log(event.data);
};
我承认这个问题与以下类似:
catching-stdout-in-realtime-from-subprocess
how-do-i-get-real-time-information-back-from-a-subprocess-popen-in-python-2-5
intercepting-stdout-of-a-subprocess-while-it-is-running
如果没有来自子进程的换行符,任何解决方案都无法工作。
【问题讨论】:
标签: python websocket subprocess stdout