如何使用nltk.corpus模块使用信号处理程序干净地退出?

时间:2015-05-06 17:49:04

标签: python windows signals

我想从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模块没有任何问题。
  • 接受的答案解决方案只是在处理程序初始化后移动import语句。这不会为我删除错误,可能是因为他们使用的是win32api.SetConsoleCtrlHandler而不是signal.signal

0 个答案:

没有答案