让我介绍一下我正在构建的应用程序的目标:我正在使用PySide(Qt)创建一个前端GUI,用于在CFD框架中使用的基于fortran的应用程序。 fortran应用程序被编译为* .exe文件,并且在执行时,它会持续提供模拟的时间流逝和其他输出细节(当我从控制台启动它时,这些数据会一直显示直到完成)。
例如,如果我从控制台执行外部代码,我会得到
>> myCFDapplication.exe
Initializing...
Simulation start...
Time is 0.2
Time is 0.4
Time is 0.6
Time is 0.8
Time is 1.0
Simulation finished
>>
“Time is ..”与下一行之间的时间相当长。
GUI的目标是为外部应用程序生成初始化文件,启动外部应用程序,最后实时向用户提供计算输出信息(作为平面文本)。 从本网站的其他类似主题,我已经能够使用以下代码从Python启动我的外部应用程序
import os, sys
import subprocess
procExe = subprocess.Popen("pru", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
while procExe.poll() is None:
line = procExe.stdout.readline()
print("Print:" + line)
但输出仅在执行完成时显示,而且整个GUI冻结直到那一刻。
我想知道如何使用Python启动我的外部应用程序,如果可能的话,实时获取输出并立即将其传递给GUI。我们的想法是使用“append(each_output_line)”函数在“TextEdit”对话框中的不同行中打印输出。
答案 0 :(得分:0)
查看Non-blocking read on a subprocess.PIPE in python并查看使用队列对子进程进行非阻塞读取。您的Qt应用程序的最大变化是您可能不得不使用multiprocessing,因为您已经观察到,应用程序中的任何阻塞都会冻结GUI。