从子进程到websocket的管道无缓冲stdout

问题描述 投票:0回答:1

您如何将标准输出从子进程传递到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

然而,如果没有子流程中的换行符,所有解决方案都无法使用。

您如何将标准输出从子进程传递到websocket,而无需等待换行符?当前,下面的代码仅在换行符上发送标准输出。 ...

python websocket subprocess stdout
1个回答
0
投票

如果写

© www.soinside.com 2019 - 2024. All rights reserved.