使用pyqt5中的QProcess执行另一个py文件,报错:QProcess: Destory while process ("python") is still running
时间: 2023-11-22 17:54:22 浏览: 85
进程管理Python+Qt5
这个错误通常发生在你销毁了 QProcess 对象但是子进程仍然在运行的时候。为了避免这个错误,你可以在销毁 QProcess 对象之前,先调用其 `kill()` 方法来终止子进程。
以下是一个示例代码,演示如何使用 QProcess 执行另一个 Python 文件,并在程序退出时终止子进程:
```python
import sys
from PyQt5.QtCore import QProcess
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.process = None
button = QPushButton('Run', self)
button.clicked.connect(self.start_process)
def start_process(self):
if self.process is not None and self.process.state() != QProcess.NotRunning:
# 如果进程正在运行,不要启动一个新的进程
return
self.process = QProcess()
self.process.finished.connect(self.process_finished)
self.process.start('python', ['other_script.py'])
def process_finished(self):
print('Process finished with exit code', self.process.exitCode())
self.process = None
def closeEvent(self, event):
if self.process is not None and self.process.state() != QProcess.NotRunning:
# 在程序退出之前,终止子进程
self.process.kill()
self.process.waitForFinished()
event.accept()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
在这个示例中,我们创建了一个 `MainWindow` 类,其中包含一个按钮,点击按钮时会启动另一个 Python 脚本 `other_script.py`。我们定义了 `start_process()` 方法来启动 QProcess,`process_finished()` 方法来处理子进程结束的信号,以及 `closeEvent()` 方法来在程序退出时终止子进程。
在 `start_process()` 方法中,我们首先检查之前是否已经启动了一个进程(即 `self.process` 不为 `None`),如果是,则直接返回。否则,我们创建一个新的 QProcess 对象,并调用其 `start()` 方法来启动 Python 解释器,并传入要执行的脚本文件路径。在 `process_finished()` 方法中,我们打印子进程的退出代码,并将 `self.process` 设置为 `None`,以便我们可以在下次点击按钮时启动新的进程。
在 `closeEvent()` 方法中,我们检查当前是否有进程正在运行,如果是,则调用 `kill()` 方法和 `waitForFinished()` 方法来终止子进程。最后,我们接受关闭事件并退出程序。
阅读全文