Python:Popen stdout=PIPE 无法读取不以结尾的行

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

我正在尝试通过 UDP 套接字从控制台应用程序路由进度条,以远程显示任务的完成状态。出于某种奇怪的原因,可以读取来自子进程 stdout.PIPE 输出的所有数据,但如果我尝试写入文件或通过 UDP 套接字传输时进度条显示为空白,则除外。我怀疑进度条根本没有被引导到 stdout.PIPE,因为它没有以结尾 因为如果我删除 stdout.PIPE 的打印语句,进度条仍会打印在控制台中。我试图用 tqdm 库重现问题:

sample_process.py

from time import sleep
from tqdm import tqdm
for i in range(10):
    print(i)
    
for i in tqdm(range(10)):
    sleep(0.5)

client.py

import socket
from subprocess import Popen, PIPE, CalledProcessError

serverAddressPort   = ("127.0.0.1", 20001)
bufferSize          = 1024

UDPClientSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
cmd = ['python', 'sample_process.py']

with Popen(cmd, stdout=PIPE, bufsize=0, universal_newlines=True) as p:
    for line in p.stdout:
        print(line, end='')
        UDPClientSocket.sendto(line.encode(), serverAddressPort)

if p.returncode != 0:
    raise CalledProcessError(p.returncode, p.args)

server.py

import socket

UDPServerSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
UDPServerSocket.bind(("127.0.0.1", 20001))
while(True):
    bytesAddressPair = UDPServerSocket.recvfrom(1024)
    message = bytesAddressPair[0]
    print(message.decode())

如果我打印(p.stdout.read()),那么在结束过程之前我不会得到任何输出。反正有没有实时读取进度条?我在 Windows 11 上使用 Python 3.9.13。

python python-3.x subprocess stdout
© www.soinside.com 2019 - 2024. All rights reserved.