为什么不 Ctrl + C 打破使用PyQt的Python程序?我想调试它并获得堆栈跟踪,出于某种原因,这比用C ++更难做到了!
答案 0 :(得分:26)
CTRL + C会导致发送信号 这个过程。 Python抓住了 信号,并设置一个全局变量, 类似于CTRL_C_PRESSED = True。 然后,每当Python解释器 它看到了执行一个新的操作码 变量设置并引发a KeybordInterrupt。
这意味着CTRL + C仅在以下情况下有效 Python解释器正在旋转。如果 口译员正在执行 用C语言编写的扩展模块 执行长时间运行的操作, CTRL + C不会中断它,除非它 明确地与Python“合作”。 例如:time.sleep()理论上是一个 阻止操作,但是 该功能的实施 与Python合作 解释器使CTRL + C工作。
这完全是设计的:CTRL + C是指 做一个“干净的中止”;这就是为什么 被变成了例外 Python(以便清理 在堆栈展开期间执行),以及它 扩展模块的支持是排序 “选择加入”。如果你想完全 中止这个过程,而不给它一个 有机会清理,你可以使用CTRL +。
当Python调用QApplication :: exec()时 (C ++函数),Qt不知道 如何与Python“合作” CTRL + C,这就是为什么它没有 工作。我认为这不是一个好方法 “使其成功”;你可能想看 如果你能通过全球来处理它 事件过滤器。 - Giovanni Bajo
将其添加到主程序解决了这个问题。
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
我不确定这与解释有什么关系。
答案 1 :(得分:2)
我同意Neil G的意见,并补充一下:
如果您不调用QApplication.exec_()来启动事件循环,而是在交互式python shell中执行您的程序(使用python -i),那么pyqt将自动处理事件交互式提示正在等待,Ctrl-C应再次按预期运行。这是因为Qt事件循环将与python解释器共享时间,而不是独占运行,允许解释器有机会捕获这些中断。