我有一个服务器脚本,我需要能够干净地关闭它。在测试通常的try..except
陈述时,我意识到这Ctrl-C
不是通常的方式。通常我会像这样包装长时间运行的任务
try:
...
except KeyboardInterrupt:
#close the script cleanly here
所以任务可以干净地关闭Ctrl-C
。我以前从未遇到过任何问题,但不知何故,当我遇到Ctrl-C
这个特定脚本运行时,脚本只是退出而没有捕获Ctrl-C
.
初始版本是使用Process
from实现的multiprocessing
。Thread
我使用from重写了脚本threading
,但同样的问题在那里。我以前用过threading
很多次,但我是multiprocessing
图书馆的新手。无论哪种方式,我以前从未经历过这种Ctrl-C
行为。
通常我总是实现哨兵等以有序的方式关闭Queues
和实例,但是这个脚本只是退出而没有任何响应。Thread
最后,我也尝试过signal.SIGINT
像这样覆盖
def handler(signal, frame):
print 'Ctrl+C'
signal.signal(signal.SIGINT, handler)
...
这里Ctrl+C
实际上被捕获了,但是处理程序没有执行,它从不打印任何东西。
除了threading
/multiprocessing
方面,部分脚本还包含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 环境中运行。