отладчик ipython: полная трассировка на интерактивном pdb? - PullRequest
6 голосов
/ 03 ноября 2011

Я недавно переключился с ipython0.10 на ipython0.11. В ipython0.11 я вижу небольшой фрагмент полного отслеживания, только когда включается отладчик python (то есть с использованием %pdb), тогда как в ipython0.10 я вижу полный возврат. Насколько я могу судить, полный возврат не доступен напрямую из командной строки pdb - вы можете перемещаться по нему с помощью 'u', но не можете видеть его напрямую.

Итак, есть ли способ показать полный трассировку? Такие как параметр конфигурации?

Или, что еще полезнее, есть ли способ заставить ipython просто показывать пойманную исключительную ситуацию, а не указывать, где в коде она была поймана?

РЕДАКТИРОВАТЬ: Пример:

In [1]: pdb
Automatic pdb calling has been turned ON

In [2]: 1/0
> <ipython-input-2-05c9758a9c21>(1)<module>()
     -1 1/0

ipdb> q
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
/Users/adam/<ipython-input-2-05c9758a9c21> in <module>()
----> 1 1/0

ZeroDivisionError: integer division or modulo by zero

Я бы хотел увидеть ZeroDivisionError до того, как q выйдет из pdb.

1 Ответ

6 голосов
/ 03 ноября 2011

есть ли способ заставить 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 .

...