【问题标题】:PyQt: Multiple QProcess and outputPyQt:多个 QProcess 和输出
【发布时间】:2018-06-19 14:24:16
【问题描述】:

我有一个 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

【问题讨论】:

    标签: python pyqt pyqt4 qprocess


    【解决方案1】:

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

    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_())
    

    【讨论】:

    • 非常感谢,有帮助!此外,我想知道是否有任何方法可以对进程进行排队以避免线程过载。假设我的程序列表非常长,我该怎么办?
    • 对不起,我的意思是“进程过载”。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    相关资源
    最近更新 更多