Программа Kill, сгенерированная подпроцессом с PyQt5 - PullRequest
0 голосов
/ 05 марта 2020

Это программа, созданная в качестве примера для объяснения.

main.py

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton
from worker import Worker


class TestUI(QWidget):
    def __init__(self):
        super().__init__()

        self.worker = Worker()

        self.init_ui()

    def init_ui(self):
        run_btn = QPushButton("Run")
        run_btn.clicked.connect(self.run)

        kill_btn = QPushButton("Kill")
        kill_btn.clicked.connect(self.kill)

        layout = QGridLayout()
        layout.addWidget(run_btn, 0, 0)
        layout.addWidget(kill_btn, 0, 1)
        self.setLayout(layout)

    def run(self):
        self.worker.run_command("calc.exe")

    def kill(self):
        self.worker.kill_command()


if __name__ == "__main__":
    APP = QApplication(sys.argv)
    ex = TestUI()
    ex.show()
    sys.exit(APP.exec_())

worker.py

import os
import signal
import subprocess
from PyQt5.QtCore import QObject


class Worker(QObject):
    def __init__(self):
        super().__init__()

    def run_command(self, cmd):
        self.proc = subprocess.Popen(cmd)

    def kill_command(self):
        # self.proc.kill() => Not working
        # self.proc.terminate() => Not working
        # os.kill(self.proc.pid, signal.SIGTERM) => Not working

Я хочу уничтожить программу, созданную подпроцессом, когда я нажимаю кнопку уничтожения. Другими словами, я хочу послать сигнал уничтожения в программу, например, нажав CTRL + C.

И когда основная программа PyQt5 завершится, я хочу, чтобы программа, сгенерированная подпроцессом, также завершилась.

Как я могу это сделать?

Пожалуйста, помогите мне с этой проблемой.

1 Ответ

0 голосов
/ 07 марта 2020

Наконец, я нашел метод.

Я использовал psutil модуль.

Это не встроенный модуль. Поэтому вам нужно сначала установить его.

pip install psutil

И теперь вы можете использовать этот модуль, как показано ниже.

def kill_command(self):
    for proc in psutil.process_iter():
        if "calc" in proc.name().lower():
            os.kill(proc.pid, signal.SIGTERM)
...