相关疑难解决方法(0)

如何防止Python中的KeyboardInterrupt中断代码块?

我正在编写一个程序,通过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)

如果它被中断,重启操作似乎很愚蠢,所以我正在寻找一种推迟中断的方法.我该怎么做呢?

python

51
推荐指数
5
解决办法
2万
查看次数

导入scipy.stats后,Ctrl-C崩溃了Python

我在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函数: …

python scipy keyboardinterrupt

32
推荐指数
2
解决办法
6343
查看次数

标签 统计

python ×2

keyboardinterrupt ×1

scipy ×1