我正在编写一个程序,通过pickle模块缓存一些结果.此刻发生的情况是,如果我在dump操作发生时按下ctrl-c,则会dump中断并且生成的文件已损坏(即只是部分写入,因此无法load再次编辑.
有没有办法制作dump,或者通常是一段代码,不间断?我目前的解决方法看起来像这样:
try:
file = open(path, 'w')
dump(obj, file)
file.close()
except KeyboardInterrupt:
file.close()
file.open(path,'w')
dump(obj, file)
file.close()
raise
Run Code Online (Sandbox Code Playgroud)
如果它被中断,重启操作似乎很愚蠢,所以我正在寻找一种推迟中断的方法.我该怎么做呢?
我在Win7 64位上运行64位Python 2.7.3.我可以通过这样做可靠地崩溃Python解释器:
>>> from scipy import stats
>>> import time
>>> time.sleep(3)
Run Code Online (Sandbox Code Playgroud)
并在睡眠期间按下Control-C.未引发KeyboardInterrupt; 翻译崩溃了.打印如下:
forrtl: error (200): program aborting due to control-C event
Image PC Routine Line Source
libifcoremd.dll 00000000045031F8 Unknown Unknown Unknown
libifcoremd.dll 00000000044FC789 Unknown Unknown Unknown
libifcoremd.dll 00000000044E8583 Unknown Unknown Unknown
libifcoremd.dll 000000000445725D Unknown Unknown Unknown
libifcoremd.dll 00000000044672A6 Unknown Unknown Unknown
kernel32.dll 0000000077B74AF3 Unknown Unknown Unknown
kernel32.dll 0000000077B3F56D Unknown Unknown Unknown
ntdll.dll 0000000077C73281 Unknown Unknown Unknown
Run Code Online (Sandbox Code Playgroud)
这使得无法中断长时间运行的scipy计算.
谷歌搜索"forrtl"等,我看到这种问题的建议是由于使用了一个覆盖Ctrl-C处理的Fortran库.我没有看到Scipy跟踪器上的错误但是假设Scipy是一个用于Python的库,我会认为这是一个错误.它打破了Python对Ctrl-C的处理.这有什么解决方法吗?
编辑:关注@ cgohlke的建议我尝试在导入scipy后添加自己的处理程序. 关于相关问题的这个问题表明添加信号处理程序不起作用.我尝试通过pywin32 使用Windows API SetConsoleCtrlHandler函数: …