如何使用 Ctrl+C 输入干净地退出 QProcess?

Posted

技术标签:

【中文标题】如何使用 Ctrl+C 输入干净地退出 QProcess?【英文标题】:How to cleanly exit a QProcess with Ctrl+C input? 【发布时间】:2020-03-12 09:37:23 【问题描述】:

我正在运行一个 QProcess 事件,该事件在 cmd 中直接按 Ctrl+C 时退出。如何从 python 发送信号以干净地关闭进程?我试过 kill() ,它不会让程序相应地保存。 terminate() 也没有响应。我希望你能帮忙。

    self.btn_1 = QPushButton('Start')
    self.btn_1.clicked.connect(self.start)

    self.btn_2 = QPushButton('Stop')
    self.btn_1.clicked.connect(self.stop)

    self.process = QProcess()

def start(self):
    self.process.start("C:\path\program.exe")

def stop(self):
    print('Stop the process!')

【问题讨论】:

【参考方案1】:

您需要获取进程PID,然后您可以通过os.kill发送信号:

import os
import signal 

os.kill(<pid>, signal.SIGINT) #SIGINT is CTRL-C

您从 QProcess 对象获取 PID:

pid = self.process.processId()

编辑:在 Windows 上,将 SIGINT 替换为 CTRL_C_EVENT

【讨论】:

感谢您的回答。它适用于关闭进程,但是,保存数据需要一些时间(例如 2 秒)并且它会过快地终止进程。你知道有什么方法可以等到数据保存完成吗? 我让它工作了。我不得不将 SIGINT 更改为 CTRL_C_EVENT。感谢您的帮助!

以上是关于如何使用 Ctrl+C 输入干净地退出 QProcess?的主要内容,如果未能解决你的问题,请参考以下文章

linuxtelnet ctrl+c 不退出问题解决

markdown 奇怪的是“git没有干净地退出(退出代码1)”

从 Perl 线程中干净地退出

GitHub & Tortoisegit:git 没有干净地退出(退出代码 128)

python多线程队列没有运行或干净地退出

干净地退出 Python Tkinter 应用程序,同时在“之后”循环中的按钮上使用“wait_variable”函数