在Python中实时更新可执行子流程控制台输出

墨菲奇

我一直在阅读这个问题指出该问题提出的解决方案没有达到我要尝试的目的。这个想法类似于这个问题,但是我在这里给出一个更好的例子。

我需要在Python 3.7中构建一个GUI,以监视和控制用C编写的旧软件的执行。现在,我正试图从Python调用一个测试可执行文件,并将其打印在GUI上,但是现在在与python相同的控制台上打印就足够了。问题是可执行文件要花很长时间才能完全执行,但同时打印控制台消息,因此我需要GUI迅速读取这些消息。

这是一个工作示例:

在Python 3.7中:

import sys
from threading import Thread
import time
import subprocess

class HandleTarget(Thread):
    def __init__(self):
        Thread.__init__(self)

    def run(self):
        subprocess.Popen(["hello.exe"], stdout=sys.stdout, bufsize=1)

class Printer(Thread):
    def __init__(self):
        Thread.__init__(self)

    def run(self):
        for i in range(1, 15):
            sys.stdout.write("Hi back ("+str(i)+")!\n")
            time.sleep(1.0)

thread_1 = HandleTarget()
thread_2 = Printer()

# Launching threads:
thread_1.start()
thread_2.start()

现在,示例可执行文件(“ hello.exe”)可以像这样在C中构建:

#include <stdio.h>
#include <time.h>

int main() {
    struct timespec time;
    double tic = 0;
    double toc = 0;

    for( int ii = 0; ii < 3 ; ii++){
        clock_gettime(CLOCK_MONOTONIC, &time);
        tic = time.tv_sec;
        toc = tic;

        while(toc-tic<3) {
        clock_gettime(CLOCK_MONOTONIC, &time);
        toc    = time.tv_sec;
        }
        printf("Hello #%d \n",ii);
    }
    return(0); 
}

理想情况下,我需要对消息“ Hello”和“ Hi back”进行交织。但是,如果我运行上面的python脚本,则会得到:

Hi back (1)!
Hi back (2)!
Hi back (3)!
Hi back (4)!
Hi back (5)!
Hi back (6)!
Hi back (7)!
Hi back (8)!
Hi back (9)!
Hello #0 
Hello #1 
Hello #2 
Hi back (10)!
Hi back (11)!
Hi back (12)!
Hi back (13)!
Hi back (14)!

显然,可执行文件的输出仅在执行完成时打印。这意味着,如果旧版可执行文件正在运行,则只有完成后才会显示任何内容。

编辑:我对此没有严格的实时限制,如果打印实际上需要几分钟,那很好,问题是,如果一个流程需要运行几天,那么每隔几小时(最好是几分钟),GUI就需要使用可执行文件中的控制台打印进行更新。

gbajson

考虑阅读Popen.stdout

https://docs.python.org/3/library/subprocess.html?highlight=subprocess#subprocess.Popen.stdout

这是更新程序的输出:

$ python test.py
Hi back (1)!
Hi back (2)!
Hi back (3)!
Hello #0
Hi back (4)!
Hi back (5)!
Hi back (6)!
Hello #1
Hi back (7)!
Hi back (8)!
Hi back (9)!
Hello #2
Hi back (10)!
Hi back (11)!
Hi back (12)!
Hi back (13)!
Hi back (14)!

更新的程序:

import sys
from threading import Thread
import time
import subprocess

class HandleTarget(Thread):
    def __init__(self):
        Thread.__init__(self)

    def run(self):
        proc = subprocess.Popen(["hello.exe"], stdout=subprocess.PIPE)
        for line in proc.stdout:
            print(line.strip().decode('utf-8'))


class Printer(Thread):
    def __init__(self):
        Thread.__init__(self)

    def run(self):
        for i in range(1, 15):
            sys.stdout.write("Hi back ("+str(i)+")!\n")
            time.sleep(1.0)

thread_1 = HandleTarget()
thread_2 = Printer()

# Launching threads:
thread_1.start()
thread_2.start()

编辑:

我还修改了C程序以在打印后刷新标准输出,缓冲的标准输出似乎是问题的根本原因:

    printf("Hello #%d \n",ii);
    fflush(stdout);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

子脚本将Python输出输出到子流程中的控制台

来自分类Dev

Java子流程额外输出到控制台

来自分类Dev

解析批处理文件中的可执行控制台输出

来自分类Dev

如何在不丢失流程或冻结应用程序的情况下在JavaFX中实时更新textarea(控制台)

来自分类Dev

读取控制台输出以在C中执行ping操作

来自分类Dev

控制台在 node.js 中记录 python 脚本控制台输出

来自分类Dev

通过python中的ssh监视控制台输出

来自分类Dev

在python中获取当前控制台输出

来自分类Dev

Python中可修改的控制台输出

来自分类Dev

如何在python中获取URL的控制台输出?

来自分类Dev

如何从代码创建完成的可执行控制台程序

来自分类Dev

编程控制台错误

来自分类Dev

从控制台实时打印输出到QTextEdit

来自分类Dev

使用Java实时重定向控制台输出流

来自分类Dev

如何使用Javascript实时输出到控制台?

来自分类Dev

在调用子流程之前,Python控制台无法打印

来自分类Dev

从控制台在子包中运行python文件

来自分类Dev

如何在Python中写入子进程的控制台?

来自分类Dev

在执行长程序期间动态更新 JTextArea 作为控制台输出?

来自分类Dev

Python获取控制台输出

来自分类Dev

Python控制台输出到变量

来自分类Dev

Python-显示控制台输出

来自分类Dev

Python控制台输出到变量

来自分类Dev

在PowerShell中禁止控制台输出

来自分类Dev

HapiJS中更好的控制台输出?

来自分类Dev

在PowerShell中禁止控制台输出

来自分类Dev

控制台Java中无输出

来自分类Dev

在Laravel中获取控制台输出

来自分类Dev

在HapiJS中更好的控制台输出?