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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top