Python PyQt:多个QProcess和输出
我有一个PyQt窗口,它将多个可执行文件作为QProcess调用。在最后一个流程完成后,如何列出每个流程的输出?(类似于process_result=[“result1”、“result2”和…) 我们可以这样说: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()以某种方式进行阅读,但它非常混乱,因为进程并行
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进程运行,非常感谢,这很有帮助!此外,我想知道是否有任何方法可以对进程进行排队,以避免线程过载。假设我的程序列表非常长,我该怎么办?对不起,我的意思是“进程过载”。谢谢