Strg-C bringt Python nach dem Import von scipy.stats zum Absturz

Ich verwende 64-Bit-Python 2.7.3 unter Win7 64-Bit. Ich kann den Python-Interpreter auf folgende Weise zuverlässig zum Absturz bringen:

>>> from scipy import stats
>>> import time
>>> time.sleep(3)

Drücken Sie im Schlaf die Strg-C-Taste. Ein KeyboardInterrupt wird nicht ausgelöst. der Dolmetscher stürzt ab Folgendes wird gedruckt:

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

Dies macht es unmöglich, lang laufende Scipy-Berechnungen zu unterbrechen.

Wenn ich nach "forrtl" und dergleichen google, sehe ich Hinweise darauf, dass diese Art von Problem auf die Verwendung einer Fortran-Bibliothek zurückzuführen ist, die die Ctrl-C-Behandlung überschreibt. Ich sehe keinen Fehler auf dem Scipy-Trackerbut, da Scipy eine Bibliothek zur Verwendung mit Python ist. Ich würde dies als Fehler betrachten. Es unterbricht Pythons Umgang mit Strg-C. Gibt es eine Problemumgehung dafür?

Edit: Nach @ cgohlkes Vorschlag habe ich versucht, meinen eigenen Handler hinzuzufügen, nachdem ich scipy importiert habe.Diese Frage Ein verwandtes Problem zeigt, dass das Hinzufügen eines Signal-Handlers nicht funktioniert. Ich habe versucht, die Windows-API zu verwendenSetConsoleCtrlHandler Funktion über pywin32:

from scipy import stats
import win32api
def doSaneThing(sig, func=None):
    print "Here I am"
    raise KeyboardInterrupt
win32api.SetConsoleCtrlHandler(doSaneThing, 1)

Wenn Sie danach Strg + C drücken, wird "Here I Am" ausgegeben, aber Python stürzt immer noch mit dem Fehler forrtl ab. Manchmal erhalte ich auch die Meldung "ConsoleCtrlHandler-Funktion fehlgeschlagen", die schnell verschwindet.

Wenn ich dies in IPython ausführe, wird vor dem Fehler forrtl ein normaler Python KeyboardInterrupt-Traceback angezeigt. Ich sehe auch ein normales Python-Traceback, gefolgt vom Fehler forrtl, wenn ich anstelle von KeyboardInterrupt einen anderen Fehler auslöse (z. B. ValueError):

ValueError                                Traceback (most recent call last)
<ipython-input-1-08defde66fcb> 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.]

Was auch immer der zugrunde liegende Handler tut, es scheint, dass er nicht nur Strg-C direkt abfängt, sondern auf die Fehlerbedingung (ValueError) reagiert und sich selbst abstürzt. Gibt es eine Möglichkeit, dies zu beseitigen?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage