我有一个服务器脚本,我需要能够干净地关闭.在测试通常的try..except语句时,我意识到Ctrl-C没有按常规方式工作.通常我会像这样包装长时间运行的任务
try:
...
except KeyboardInterrupt:
#close the script cleanly here
所以可以在Ctrl-C上干净地关闭任务.我之前从未遇到过任何问题,但是当我按下Ctrl-C时,当这个特定的脚本运行时,脚本只是退出而没有捕获Ctrl-C.
初始版本是使用多处理过程实现的.我使用线程从线程重写脚本,但同样的问题.我以前曾多次使用过线程,但我是多处理库的新手.无论哪种方式,我以前从未经历过这种Ctrl-C行为.
通常我总是实现了哨兵等以有序的方式关闭队列和线程实例,但是这个脚本只是退出而没有任何响应.
最后,我尝试覆盖signal.SIGINT,就像这样
def handler(signal, frame):
print 'Ctrl+C'
signal.signal(signal.SIGINT, handler)
...
这里实际上是Ctrl C被捕获,但是处理程序没有执行,它从不打印任何东西.
除了线程/多处理方面,脚本的一部分包含C SWIG对象.我不知道这与它有什么关系.我在OS X Lion上运行Python 2.7.2.
那么,有几个问题:
>这里发生了什么?
>我该如何调试?
>为了解根本原因,我需要学习什么?
请注意:脚本的内部是专有的,所以我不能给出代码示例.然而,我非常愿意接收指针,所以我可以自己调试.如果有人能指出我正确的方向,我有足够的经验能够弄明白.
编辑:我开始评论输入等,看看是什么导致了奇怪的行为,我把它缩小到导入C SWIG库.为什么导入C SWIG库’窃取’Ctrl-C的想法?我不是有罪图书馆的作者,但我的SWIG经验有限,所以不知道从哪里开始……
编辑2:我刚刚在Windows机器上尝试了相同的脚本,在Windows 7中按预期捕获了Ctrl-C.我真的不打算使用OS X部分,无论如何,脚本都将在Windows环境中运行.