我想从CTRL-C键盘事件处理signal.SIGINT
以在退出主线程之前安全地退出我的进程。我知道如何使用信号处理程序执行此操作,但如果我的任何线程或进程导入模块,nltk.corpus.stopwords
以某种方式阻止信号处理程序运行。我所假设的是,模块是如此之大,以至于在信号产生时它仍然被加载,但我不是百分百肯定的。
这是一个最小的完整且可验证的例子
以下代码按预期工作。
import signal
import time
import sys
def signal_handler(signum, frame):
print "Safely exiting processes"
for p in proc:
print p
sys.exit(0)
proc = [1, 2, 3, 4]
signal.signal(signal.SIGINT, signal_handler)
print('Press Ctrl+C to interrupt download')
while(True):
time.sleep(1)
print 'wait'
它产生预期的输出:
> Press Ctrl+C to interrupt download
> wait
> wait
> Safely exiting processes
> 1
> 2
> 3
> 4
添加导入语句
from nltk.corpus import stopwords
将输出更改为此错误消息:
> Press Ctrl+C to interrupt download
> wait
> wait
> forrtl: error (200): program aborting due to control-C event
> Image PC Routine Line Source
>
> kernel32.dll 0000000077544AE3 Unknown Unknown Unknown
> kernel32.dll 00000000775059ED Unknown Unknown Unknown
> ntdll.dll 000000007763C541 Unknown Unknown Unknown
Ctrl-C crashes Python after importing scipy.stats是一个非常相似的问题,但所描述的行为略有不同,并且接受的答案对我不起作用。
time
模块获取相同的错误消息。我对time
模块没有任何问题。win32api.SetConsoleCtrlHandler
而不是signal.signal