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) и сам сбой. Есть ли способ устранить это?

Ответы на вопрос(6)

Ваш ответ на вопрос