Спустя пять лет после того, как вы написали это, IPython по-прежнему работает таким образом, так что я думаю, что решение может быть полезным для людей, гуглящих это.
IPython заменяет sys.excepthook
каждый раз, когда вы выполняете строку кода, поэтому переопределение sys.excepthook не имеет никакого эффекта. Более того, IPython даже не вызывает sys.excepthook
, он перехватывает все исключения и обрабатывает их сам, прежде чем что-то достигнет.
Чтобы переопределить обработчик исключений во время работы IPython, вы можете monkeypatch через метод showtraceback
их оболочки. Например, вот как я переопределяю, чтобы дать то, что выглядит как обычная трассировка Python (потому что мне не нравится, насколько подробны IPython):
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
Это работает как в обычной терминальной консоли, так и в консоли Qt.