我有一个基于PyQt4的python 2.7应用程序。我需要在特定的处理程序中处理Ctrl + C(KeyboardInterrupt
,SIGINT
,2)。我看到通过按Ctrl + C创建的异常没有被try-except
块捕获,并且在signal
库注册的处理函数中没有看到。 Ctrl + C什么都不做!
我试图在没有PyQt的情况下做同样的事情 - signal
效果很好
用于测试的代码不使用任何PyQt API,因此我可以在两种情况下都检查它。
答案 0 :(得分:1)
CTRL + C会将信号发送到进程。 Python捕获信号,并设置一个全局变量,如CTRL_C_PRESSED = True。然后,每当Python解释器执行一个新的操作码时,它就会看到变量集并引发一个KeybordInterrupt。
这意味着CTRL + C仅在Python解释器正在旋转时才起作用。如果解释器正在执行用C编写的执行长时间运行操作的扩展模块,则CTRL + C不会中断它,除非它明确地"合作"用Python。例如:time.sleep()理论上是一个阻塞操作,但该函数的实现"合作"使用Python解释器使CTRL + C工作。
这完全是设计的:CTRL + C意味着做一个"干净的中止&#34 ;;这就是它被Python变成异常的原因(以便在堆栈展开期间执行清理),并且它对扩展模块的支持有点像选择"选择加入"。如果你想彻底中止这个过程,而不给它一个清理的机会,你可以使用CTRL +。
当Python调用QApplication :: exec()(C ++函数)时,Qt不知道如何"合作"用于CTRL + C的Python,这就是为什么它不起作用。我不认为这是一个很好的方法,可以让它发挥作用&#34 ;;您可能想看看是否可以通过全局事件过滤器处理它。 - Giovanni Bajo
将其添加到主程序解决了这个问题。
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
我不确定这与解释有什么关系。