Ctrl-C不适用于PyQt

时间:2011-03-01 21:28:19

标签: python pyqt

为什么不 Ctrl + C 打破使用PyQt的Python程序?我想调试它并获得堆栈跟踪,出于某种原因,这比用C ++更难做到了!

2 个答案:

答案 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解释器共享时间,而不是独占运行,允许解释器有机会捕获这些中断。