Ctrl-C вылетает Python после импорта scipy.stats
Я использую 64-битный Python 2.7.3 на 64-битной Win7. Я могу надежно завершить работу интерпретатора Python, выполнив это:
>>> from scipy import stats
>>> import time
>>> time.sleep(3)
и нажав 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
Это делает невозможным прерывание длительных вычислений scipy.
Погуглив для "forrtl» и тому подобное, я вижу предположения, что проблема такого рода связана с использованием библиотеки Fortran, которая переопределяет обработку Ctrl-C. Я нея не вижу ошибку на трекере Scipy, но учитывая, что Scipy - это библиотека для использования с Python, я бы посчитал это ошибкой. Ломает питонаs обработка Ctrl-C. Есть ли обходной путь для этого?
Изменить: После @cgohlke 'Я попытался добавить свой собственный обработчик после импорта scipy.Этот вопрос о связанной проблеме показывает, что добавление обработчика сигнала нет работа. Я пытался использовать Windows APISetConsoleCtrlHandler функция через pywin32:
from scipy import stats
import win32api
def doSaneThing(sig, func=None):
print "Here I am"
raise KeyboardInterrupt
win32api.SetConsoleCtrlHandler(doSaneThing, 1)
После этого нажимаем Ctrl-C "А вот и я", но Python по-прежнему падает с ошибкой forrtl. Иногда я также получаю сообщение «Сбой функции ConsoleCtrlHandler ", который быстро исчезает.
Если я запускаю это в IPython, я вижу обычную трассировку Python KeyboardInterrupt перед ошибкой forrtl. Я также вижу обычную трассировку Python, за которой следует ошибка forrtl, если вместо KeyboardInterrupt возникает другая ошибка (например, ValueError):
ValueError Traceback (most recent call last)
in doSaneThing(sig, func)
3 def doSaneThing(sig, func=None):
4 print "Here I am"
----> 5 raise ValueError
6 win32api.SetConsoleCtrlHandler(doSaneThing, 1)
ValueError:
forrtl: error (200): program aborting due to control-C event
[etc.]
Кажется, что бы ни делал основной обработчик, он 'не просто перехватывает Ctrl-C напрямую, но и реагирует на состояние ошибки (ValueError) и сам сбой. Есть ли способ устранить это?