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?