连续读取python子进程的stdout

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

我需要运行一个可执行文件,它在运行时将消息输出到标准输出,但是当使用子进程时,它似乎要等待脚本完全完成才能发送消息。以下是我的问题的基本实现。

我已经设法通过向 python 脚本添加 sys.stdout.flush() 或使用

cmd = ['python', '-u', 'Y:\\process.py']
使 python 异步来修复它,但这两个修复在我需要运行的可执行文件中都是不可能的。

main.py

import subprocess

cmd = ['python', 'Y:\\process.py']


popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)
for line in popen.stdout: 
    print(line)

process.py

import time
import sys

for i in range(5):
    print(i)
    # sys.stdout.flush()
    time.sleep(1)

有人知道如何解决这个问题吗?我计划使用 QProcess 在 PyQt gui 中实现这一点,尽管该实现中也存在问题。

如有任何帮助,我们将不胜感激。

python subprocess popen
1个回答
0
投票

如果你有 WSL ...相信它有 stdbuf 实用程序(至少 ubuntu 是这么说的),它也可能有提到的 unbuffer 实用程序(顺便说一句,没有使用过的经验)

bgen.py
import subprocess
import sys
import datetime

cmd = [ "/home/tester/someprocess" ]

if 'stdbuf' in sys.argv:
    cmd = [ "/usr/bin/stdbuf", "-o0", "/home/tester/someprocess" ]

print(f'{datetime.datetime.now()} :: running: {cmd}' )

popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)
for line in popen.stdout: 
    print(f'{datetime.datetime.now()} :: got:{line.rstrip()}')

someprocess.c
include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    for( int iter=0; iter <= 5; iter++ ){
        printf( "iteration %d\n", iter );
        sleep(1);
    }
}

# buffered 
python bgen.py
2024-08-19 16:18:44.366847 :: running: ['/home/tester/someprocess']
2024-08-19 16:18:50.368800 :: got:iteration 0
2024-08-19 16:18:50.368871 :: got:iteration 1
2024-08-19 16:18:50.368908 :: got:iteration 2
2024-08-19 16:18:50.368937 :: got:iteration 3
2024-08-19 16:18:50.368966 :: got:iteration 4
2024-08-19 16:18:50.368994 :: got:iteration 5

# unbuffered
python bgen.py stdbuf
2024-08-19 16:18:58.908986 :: running: ['/usr/bin/stdbuf', '-o0', '/home/tester/someprocess']
2024-08-19 16:18:58.910353 :: got:iteration 0
2024-08-19 16:18:59.910556 :: got:iteration 1
2024-08-19 16:19:00.910656 :: got:iteration 2
2024-08-19 16:19:01.910810 :: got:iteration 3
2024-08-19 16:19:02.910920 :: got:iteration 4
2024-08-19 16:19:03.911044 :: got:iteration 5

希望这有帮助...

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