终止子流程。在PyQt5中打开

霍亚

我想取消由subprocess.Popen运行的进程。

该代码用于说明。

test_ui.py

import sys
from PyQt5.QtWidgets import (
    QApplication,
    QWidget,
    QHBoxLayout,
    QVBoxLayout,
    QPushButton,
    QTextEdit,
)
from test_worker import TestWorker


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

        self.worker = TestWorker()
        self.worker.outSignal.connect(self.logging)

        self.result = QTextEdit()

        self.init_ui()

    def init_ui(self):
        start_button = QPushButton("Start")
        start_button.clicked.connect(self.start)

        cancel_button = QPushButton("Cancel")
        cancel_button.clicked.connect(self.cancel)

        hlayout = QHBoxLayout()
        hlayout.addWidget(start_button)
        hlayout.addWidget(cancel_button)

        vlayout = QVBoxLayout()
        vlayout.addLayout(hlayout)
        vlayout.addWidget(self.result)

        self.setLayout(vlayout)
        self.show()

    def start(self):
        self.result.clear()
        self.worker.run_command(["ping stackoverflow.com -n 30"])

    def cancel(self):
        self.worker.cancel_command()

    def logging(self, msg):
        msg = msg.strip()
        if msg != "":
            self.result.append(msg)


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

test_worker.py

import os
import signal
import threading
import subprocess
from PyQt5.QtCore import QObject, pyqtSignal


class TestWorker(QObject):
    outSignal = pyqtSignal(str)

    def __init__(self):
        super().__init__()

    def run_command(self, cmd):
        threading.Thread(target=self._execute_command, args=(cmd), daemon=True).start()

    def cancel_command(self):
        # self.proc.kill()
        # os.kill(self.proc.pid, signal.SIGTERM)

    def _execute_command(self, cmd):
        self.proc = subprocess.Popen(
            cmd,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            shell=True,
            universal_newlines=True,
        )
        for line in self.proc.stdout:
            self.outSignal.emit(line)

self.proc.kill()=>无效。但是需要“ shell = True”。

os.kill(self.proc.pid, signal.SIGTERM)=>它也不起作用。而且,如果我按两次“取消”按钮,则会出现错误。

“ FileNotFoundError:[WinError 2]系统找不到指定的文件”

请帮助我解决这个问题。

永乐

您必须使用一个标志来指示应取消该进程,然后终止该进程并完成线程执行。Athreading.Event可以用于这种情况。

class TestWorker(QObject):
    outSignal = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.stop_event = threading.Event()

    def run_command(self, cmd):
        self.stop_event.clear()
        threading.Thread(target=self._execute_command, args=(cmd), daemon=True).start()

    def cancel_command(self):
        self.stop_event.set()

    def _execute_command(self, cmd):
        if self.stop_event.isSet():
            return
        proc = subprocess.Popen(
            cmd,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            shell=True,
            universal_newlines=True,
        )
        if self.stop_event.isSet():
            proc.kill()
            return
        for line in proc.stdout:
            if self.stop_event.isSet():
                proc.kill()
                return
            self.outSignal.emit(line)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

利用PyQt5中的QtQuick控件

来自分类Dev

如何在C中达到一定时间限制后准确地终止子进程?

来自分类Dev

PyQt5 QObject:无法为处于不同线程中的父级创建子级

来自分类Dev

Python PyQt5 QMessageBox无法打开

来自分类Dev

在PyQt5中未触发dropEvent

来自分类Dev

更新PYQT5中的图表数据

来自分类Dev

在PyQt5中实现画布

来自分类Dev

在PyQt5中打印pdf文档

来自分类Dev

在PyQt5中串联多个QSplitter

来自分类Dev

PyQt5中的顺序编程复制

来自分类Dev

如何在pyqt5中关闭窗口并终止程序?程序被卡住

来自分类Dev

终止子进程的父进程的输出是什么?

来自分类Dev

如何终止在子流程中打开的所有子流程

来自分类Dev

在Windows 7中安装PyQt5

来自分类Dev

在承诺结束时终止子进程

来自分类Dev

子对话框未显示在PyQt5中

来自分类Dev

QTableWidget中的PyQt5 QComboBox

来自分类Dev

asyncio在超时时终止子进程

来自分类Dev

PyQt5中的哪个Gstreamer?

来自分类Dev

PyQt5 中的问号按钮

来自分类Dev

PyQt5 中的 QWebEngineView 和 QWidget

来自分类Dev

PyQt5 中的访问冲突错误

来自分类Dev

在一段时间后终止子进程

来自分类Dev

PyQt5 Dialog 窗口打开时没有布局

来自分类Dev

在 PyQt5 中打开多个窗口时遇到问题

来自分类Dev

Python PyQT5 在 mainWindow 中打开小部件

来自分类Dev

在 Pyqt5 中从 First 打开第二个表单

来自分类Dev

父鱼壳进程终止后立即终止子进程?

来自分类Dev

掌握 PyQt5 GUI 与按钮打开额外的 GUI