Python PyQt:多个QProcess和输出

Python PyQt:多个QProcess和输出,python,pyqt,pyqt4,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()以某种方式进行阅读,但它非常混乱,因为进程并行

我有一个PyQt窗口,它将多个可执行文件作为QProcess调用。在最后一个流程完成后,如何列出每个流程的输出?(类似于process_result=[“result1”、“result2”和…) 我们可以这样说:

for i in list_of_processes:
    process = QtCore.QProcess()
    process.start(i)
我可以用
process.readyReadStandardOutput()
以某种方式进行阅读,但它非常混乱,因为进程并行运行
process.waitForFinished()
无法工作,因为GUI将冻结。
此外,我还查看了以下关于多线程的页面:。另一个问题与此类似,但对我也没有帮助:。

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

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_())
导入系统 从functools导入部分 从PyQt4导入QtCore、QtGui 类任务管理器(QtCore.QObject): resultChanged=QtCore.pyqtSignal(列表) def uuu init uuu(self,parent=None): QtCore.QObject.\uuuuuu init\uuuuuuuu(自,父) self.results=[] self.m_进程=[] self.number\u进程\u运行=0 def启动程序(自身、程序): 对于i,枚举中的程序(程序): 进程=QtCore.QProcess(自) process.readyReadStandardOutput.connect(部分(self.onReadyReadStandardOutput,i)) 进程启动(程序) self.m_processs.append(进程) self.results.append(“”) self.number\u进程\u正在运行+=1 def onReadyReadStandardOutput(自身,i): process=self.sender() self.results[i]=process.readAllStandardOutput() self.number\u进程\u正在运行-=1
如果self.number\u进程运行,非常感谢,这很有帮助!此外,我想知道是否有任何方法可以对进程进行排队,以避免线程过载。假设我的程序列表非常长,我该怎么办?对不起,我的意思是“进程过载”。谢谢