【问题标题】:Execute external *.exe application using Python and display output in real time使用 Python 执行外部 *.exe 应用程序并实时显示输出
【发布时间】:2015-12-28 08:28:35
【问题描述】:

让我介绍一下我正在构建的应用程序的目标:我正在使用 PySide (Qt) 为 CFD 框架中使用的基于 fortran 的应用程序创建一个前端 GUI。 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”对话框内的不同行中打印输出。

【问题讨论】:

  • 不知道这是否适用于您的特定情况,但请尝试在应用程序的事件循环启动后运行该进程,然后定期调用qApp.processEvents()轮询循环。
  • 感谢您的回答!无论如何,我无法通过使用QCoreApplication.processevent() 使其工作。我在我的函数def startSimulation(self): procExe = subprocess.Popen("pru", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) while procExe.poll() is None: QCoreApplication.processEvents() line = procExe.stdout.readline() self.console.append(line) 中以以下方式包含它你是不是这个意思?
  • 我认为“无法使其工作”意味着它仍然会阻塞?如果是这样,您可能必须将处理移至单独的线程,然后在有新输出时从线程发出自定义信号(SO 上有几十个问题显示如何在 PyQt/PySide 中执行此操作)。但是,也不能保证这会奏效 - 在这种情况下,您需要尝试 multiprocessing
  • 是的,它仍然处于阻塞状态。谢谢,我会继续阅读...如您所见,我是这方面的新手,但我仍在了解 python 和 GUI 编程。

标签: python qt user-interface pyside


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多