Как убить процесс в отдельном режиме - PullRequest
1 голос
/ 05 февраля 2020

Я разрабатываю приложение в Python 3.8 с PyQt5.

Мне нужно запустить и убить отдельный процесс из формы PyQT. Когда я использую process.start , а затем process.kill , это убивает процесс.

Но когда я использую process.startDetached(), process.kill() не работает.

Ниже приведен пример:

from form import Ui_MainWindow
from PyQt5 import QtWidgets

class myapp(QtWidgets.QMainWindow):

    def __init__(self):
        super(myapp, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.process = QProcess(self)
        self.ui.pushButton.clicked.connect(self.btnClicked)
        self.ui.pushButton_2.clicked.connect(self.process.kill)

    def btnClicked(self):
        runstr = 'ping'
        args = ['localhost','-t']
        self.process.startDetached(runstr, args)

app = QtWidgets.QApplication([])
application = myapp()
application.show()
sys.exit(app.exec())

Не могли бы вы посоветовать, как убить? процесс в отдельном режиме.

1 Ответ

0 голосов
/ 05 февраля 2020

Когда вы запускаете отключенный процесс, QProcess не может завершить процесс, поэтому в этих случаях вы должны получить pid дочернего процесса и использовать методы OS для его уничтожения, как указано в ответах на следующие вопросы:

from PyQt5 import QtCore, QtWidgets

import psutil

from form import Ui_MainWindow


class MyApp(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MyApp, self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.process = QtCore.QProcess(self)
        self.ui.pushButton.clicked.connect(self.start_process)
        self.ui.pushButton_2.clicked.connect(self.stop_process)
        self._pid = -1

    @QtCore.pyqtSlot()
    def start_process(self):
        runstr = "ping"
        args = ["localhost", "-t"]
        self.process.setProgram(runstr)
        self.process.setArguments(args)
        ok, pid = self.process.startDetached()
        if ok:
            self._pid = pid

    @QtCore.pyqtSlot()
    def stop_process(self):
        if self._pid > 0:
            p = psutil.Process(self._pid)
            p.terminate()
            self._pid = -1


if __name__ == "__main__":

    import sys

    app = QtWidgets.QApplication(sys.argv)
    application = MyApp()
    application.show()
    sys.exit(app.exec_())
...