есть ли способ заставить ipython просто показывать пойманную исключительную ситуацию, а не указывать, где в коде он был пойман?
Вы можете использовать sys.excepthook
:
import sys
def exc_hook(type, value, traceback):
print type
sys.excepthook = exc_hook
Из документации модуля sys
:
sys.excepthook(type, value, traceback)
Эта функция печатаетзаданная трассировка и исключение для sys.stderr.
Когда исключение возникает и не обрабатывается, интерпретатор вызывает sys.excepthook с тремя аргументами, классом исключения, экземпляром исключения и объектом трассировки.В интерактивном сеансе это происходит непосредственно перед тем, как управление возвращается к приглашению;в программе Python это происходит непосредственно перед выходом из программы.Обработка таких исключений верхнего уровня может быть настроена путем назначения другой функции с тремя аргументами sys.excepthook
.
sys.__displayhook__
sys.__excepthook__
Эти объекты содержат исходные значения displayhook и exchook в начале программы.Они сохраняются, так что displayhook и exchook могут быть восстановлены в случае, если они заменяются битыми объектами.
Вы также можете попробовать запустить ipython с параметром --xmode
, установленным на Plain
От IPython reference :
$ ipython [options] files
--xmode=<modename>
Режим создания отчетов об исключениях.
Допустимые режимы: Plain, Context и Verbose.
Обычный : похож на обычную печать трассировки Python.
Context : печатает 5 строк исходного кода контекста вокруг каждой строки в трассировке.
Подробно : аналогично Context, но дополнительно печатает переменные, видимые в данный момент в том месте, где произошло исключение (сокращая их строки, если они слишком длинные).Это может быть очень медленным, если у вас есть огромная структура данных, чье строковое представление сложно вычислить.Ваш компьютер может некоторое время зависать при использовании процессора на уровне 100%.Если это произойдет, вы можете отменить трассировку с помощью Ctrl-C (возможно, нажав ее несколько раз).
Вот несколько примеров использования.Обратите внимание на разницу в строках для каждой трассировки:
--xmode=Plain
:
[ 19:55 jon@hozbox ~/SO/python ]$ ipython --xmode=Plain ipython-debugger-full-traceback-on-interactive-pdb.py
------------------------------------------------------------
Traceback (most recent call last):
File "ipython-debugger-full-traceback-on-interactive-pdb.py", line 2, in <module>
1 / 0
ZeroDivisionError: integer division or modulo by zero
--xmode=Context
:
[ 19:55 jon@hozbox ~/SO/python ]$ ipython --xmode=Context ipython-debugger-full-traceback-on-interactive-pdb.py
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>()
1
----> 2 #!/usr/bin/python
3 1 / 0
4
5
ZeroDivisionError: integer division or modulo by zero
--xmode=Verbose
:
[ 19:54 jon@hozbox ~/SO/python ]$ ipython --xmode=Verbose ipython-debugger-full-traceback-on-interactive-pdb.py
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>()
1
----> 2 #!/usr/bin/python
3 1 / 0
4
5
ZeroDivisionError: integer division or modulo by zero
И без указания файла .py:
--xmode=Plain
:
[ 19:55 jon@hozbox ~/SO/python ]$ ipython --xmode=Plain
In [1]: 1 / 0
------------------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
--xmode=Context
:
[ 20:03 jon@hozbox ~/SO/python ]$ ipython --xmode=Context
In [1]: 1 / 0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/<ipython console> in <module>()
ZeroDivisionError: integer division or modulo by zero
--xmode=Verbose
:
[ 20:01 jon@hozbox ~/SO/python ]$ ipython --xmode=Verbose
In [1]: 1 / 0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/<ipython console> in <module>()
ZeroDivisionError: integer division or modulo by zero
Использованиеотладчик Python .