我有一个基于PyQt4的python2.7应用程序。我需要在特定的处理程序中处理Ctrl+C (KeyboardInterrupt,SIGINT,2)。我看到通过点击Ctrl+C创建的异常没有在try-except块中捕获,也没有在signal库注册的处理程序函数中看到。Ctrl+C什么都不做!
我也尝试过在没有PyQt的情况下做同样的事情-- signal效果很好。
用于测试的代码不使用任何PyQt API,因此在这两种情况下我都可以使用它进行检查。
发布于 2017-03-15 15:30:05
CTRL+C会导致向进程发送信号。Python捕获信号,并设置一个全局变量,类似于CTRL_C_PRESSED = True。然后,每当Python解释器执行新的操作码时,它就会看到变量集并引发一个KeybordInterrupt。 这意味着CTRL+C只有在Python解释器正在旋转时才能工作。如果解释器正在执行用C编写的扩展模块,该扩展模块执行长时间运行的操作,CTRL+C不会中断它,除非它与Python显式地“合作”。从理论上讲,time.sleep()是一种阻塞操作,但该函数的实现与Python解释器“合作”,以使CTRL+C工作。 这一切都是由设计完成的: CTRL+C的目的是进行“干净中止”;这就是为什么它会被Python转换为异常(以便在堆栈解除时执行清理),扩展模块对它的支持也算是“选择-in”。如果您想完全中止进程,而不给它一个清理的机会,您可以使用CTRL+。 当Python调用QApplication::exec() ( C++函数)时,Qt不知道如何与PythonforPythonforCTRL+C“合作”,这就是它不能工作的原因。我不认为有一个好的方法来“使它工作”,你可能想看看你是否可以通过全局事件过滤器来处理它。-乔瓦尼·巴霍
将此添加到主程序中解决了这个问题。
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)我不知道这和解释有什么关系。
https://stackoverflow.com/questions/42814093
复制相似问题