使用Python执行外部* .exe应用程序并实时显示输出

时间:2015-09-30 13:57:15

标签: python qt user-interface pyside

让我介绍一下我正在构建的应用程序的目标:我正在使用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”对话框中的不同行中打印输出。

1 个答案:

答案 0 :(得分:0)

查看Non-blocking read on a subprocess.PIPE in python并查看使用队列对子进程进行非阻塞读取。您的Qt应用程序的最大变化是您可能不得不使用multiprocessing,因为您已经观察到,应用程序中的任何阻塞都会冻结GUI。