python - PyQt:多个 QProcess 和输出

标签 python pyqt pyqt4 qprocess

我有一个 PyQt 窗口调用多个可执行文件作为 QProcess。如何在最后一个过程完成后列出每个过程的输出? (类似于 process_result = ["result1", "result2",..]) 让我们假设它看起来像这样:

for i in list_of_processes:
    process = QtCore.QProcess()
    process.start(i)

我可以用 process.readyReadStandardOutput() 以某种方式阅读,但它非常困惑,因为进程并行运行。 process.waitForFinished() 不起作用,因为 GUI 将卡住。 另外,我检查了以下关于多线程的页面:Multithreading PyQt applications with QThreadPool .另一个问题类似但也没有帮助我:Pyside: Multiple QProcess output to TextEdit .

最佳答案

一个可能的解决方案是创建一个类来管理进程,并在所有进程按您的要求完成时发出一个信号。

import sys

from functools import partial

from PyQt4 import QtCore, QtGui


class TaskManager(QtCore.QObject):
    resultsChanged = QtCore.pyqtSignal(list)

    def __init__(self, parent=None):
        QtCore.QObject.__init__(self, parent)
        self.results = []
        self.m_processes = []
        self.number_process_running = 0

    def start_process(self, programs):
        for i, program in enumerate(programs):
            process = QtCore.QProcess(self)
            process.readyReadStandardOutput.connect(partial(self.onReadyReadStandardOutput, i))
            process.start(program)
            self.m_processes.append(process)
            self.results.append("")
            self.number_process_running += 1

    def onReadyReadStandardOutput(self, i):
        process = self.sender()
        self.results[i] = process.readAllStandardOutput()
        self.number_process_running -= 1
        if self.number_process_running <= 0:
            self.resultsChanged.emit(self.results)

def on_finished(results):
    print(results)
    QtCore.QCoreApplication.quit()

if __name__ == '__main__':
    app = QtCore.QCoreApplication(sys.argv)
    manager = TaskManager()
    manager.start_process(["ls", "ls"])
    manager.resultsChanged.connect(on_finished)
    sys.exit(app.exec_())

关于python - PyQt:多个 QProcess 和输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50930792/

相关文章:

python - 传递调用triggered.connect()的QAction对象作为我单击QAction后触发的函数中的参数

python - 从 QT 应用程序创建 PDF

python - 在大多数 IDE 中自动补全不适用于 PyQT4 和 PyKDE4

python - 我想获取一个字符串列表,在另一个 csv 文件中找到它们并从匹配行打印一个字段

python - 如何使用 `asyncio.sleep()` 包含的代码进行单元测试?

python - 将列表映射到霍夫曼树,同时保留相对顺序

python - 将整个 *ui 文件加载到另一个 *.ui 文件的框架/小部件中

python - Tensorflow 2.1/Keras - 尝试卡住图形时出现 "output_node is not in graph"错误

python - PyQt:如何设置窗口大小以匹配小部件大小?

python - 在 PyQt5 的 TableView 中显示 pandas DataFrame,其中列设置为索引