PyQt:多个 QProcess 和输出
PyQt: Multiple QProcess and output
我有一个 PyQt window 调用多个可执行文件作为 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. Another question is similar but did not help me either: Pyside: Multiple QProcess output to TextEdit.
一个可能的解决方案是创建一个 class 来管理进程,并在所有进程按您的要求完成时发出一个信号。
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_())
我有一个 PyQt window 调用多个可执行文件作为 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. Another question is similar but did not help me either: Pyside: Multiple QProcess output to TextEdit.
一个可能的解决方案是创建一个 class 来管理进程,并在所有进程按您的要求完成时发出一个信号。
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_())