non può ignorare sys.excepthook
Domanda
cerco di personalizzare il comportamento di sys.excepthook
come descritto da la ricetta .
in ipython:
:import pdb, sys, traceback
:def info(type, value, tb):
: traceback.print_exception(type, value, tb)
: pdb.pm()
:sys.excepthook = info
:--
>>> x[10] = 5
-------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
NameError: name 'x' is not defined
>>>
pdb.pm()
non viene chiamato. Sembra che sys.excepthook = info
non funziona nella mia installazione di Python 2.5.
Soluzione
ipython, che si sta utilizzando, invece della normale shell interattiva di Python, intrappola tutti si eccezioni e non utilizza sys.excepthook. Eseguirlo come ipython -pdb
invece di ipython
, e richiamerà automaticamente PPB su di eccezioni non gestite fanno, proprio come si sta cercando di fare con il vostro excepthook.
Altri suggerimenti
Cinque anni dopo è stato scritto da, IPython funziona ancora in questo modo, quindi credo che una soluzione potrebbe essere utile alle persone googling questo.
IPython sostituisce sys.excepthook
ogni volta che si esegue una riga di codice, in modo che il primario di sys.excepthook non ha alcun effetto. Inoltre, IPython non ha nemmeno chiamare sys.excepthook
, cattura tutte le eccezioni e gestisce essa stessa prima che le cose così lontano.
Per ignorare il gestore di eccezioni, mentre IPython è in esecuzione, è possibile monkeypatch sopra il metodo showtraceback
del loro guscio. Ad esempio, ecco come sovrascrivo a dare quello che sembra un traceback Python ordinario (perché non mi piace come verboso di IPython sono):
def showtraceback(self):
traceback_lines = traceback.format_exception(*sys.exc_info())
del traceback_lines[1]
message = ''.join(traceback_lines)
sys.stderr.write(message)
import sys
import traceback
import IPython
IPython.core.interactiveshell.InteractiveShell.showtraceback = showtraceback
Questo funziona sia nel normale console terminale e la console Qt.
ampliando Chris risposta, è possibile utilizzare un'altra funzione come un decoratore di aggiungere le proprie funzionalità per jupyters showbacktrace:
from IPython.core.interactiveshell import InteractiveShell
from functools import wraps
import traceback
import sys
def change_function(func):
@wraps(func)
def showtraceback(*args, **kwargs):
# extract exception type, value and traceback
etype, evalue, tb = sys.exc_info()
if issubclass(etype, Exception):
print('caught an exception')
else:
# otherwise run the original hook
value = func(*args, **kwargs)
return value
return showtraceback
InteractiveShell.showtraceback = change_function(InteractiveShell.showtraceback)
raise IOError
questa domanda SO e assicurarsi che non ci sia qualcosa nel vostro sitecustomize.py
che impedisce il debug in modalità interattiva.