отладчик ipython: полная трассировка в интерактивной pdb?

#python #ipython #pdb #ipdb

#python #ipython #pdb #ipdb

Вопрос:

Недавно я перешел с 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. Это ошибка в IPython 0.11 — трассировка печатается после выхода из отладчика, а не до его запуска. Это будет исправлено на 0.12 (который должен выйти до Рождества).

Ответ №1:

есть ли какой-либо способ заставить 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 и excepthook в начале программы. Они сохраняются, чтобы displayhook и excepthook можно было восстановить в случае, если они будут заменены поврежденными объектами.


Вы также можете попробовать запустить ipython с --xmode параметром, установленным на Plain

Из ссылки на IPython:

 $ ipython [options] files

--xmode=<modename>
  

Режим для создания отчетов об исключениях.

Допустимые режимы: обычный, контекстный и подробный.

Обычный: похож на обычную печать трассировки в python.

Контекст: выводит 5 строк исходного кода контекста вокруг каждой строки в трассировке.

Подробный: аналогично контексту, но дополнительно выводит переменные, которые в данный момент видны там, где произошло исключение (сокращая их строки, если они слишком длинные). Это может быть очень медленным, если у вас есть огромная структура данных, строковое представление которой сложно вычислить. Может показаться, что ваш компьютер на некоторое время зависает при загрузке процессора на 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.

Комментарии:

1. Вторая часть вашего сообщения (—xmode ) кажется ответом, но, похоже, это не работает. Я перепробовал все 3 названия режимов, и все трассировки выглядят одинаково. Есть идеи, что является причиной этого?

2. Спасибо. К сожалению, это указывает на то, что предположительно является ошибкой в (моей копии?) ipython: $ ipython --xmode=Plain WARNING: Unrecognized alias: 'xmode', it will probably have no effect. Однако, один раз в ipython: In [1]: %xmode Exception reporting mode: Plain работает нормально

3. Я понимаю. Возможно, вам потребуется создать чистую копию ipython (или переустановить с помощью easy_install / pip). В качестве обходного пути вы можете добавить эту %mode ... строку в качестве команды инициализации в файл ~/.ipython/ config, и проблема решена (надеюсь)!

4. Похоже, что --xmode стало --InteractiveShell.xmode . Итак, чтобы получить полную трассировку с контекстом и переменными, используйте: ipython --InteractiveShell.xmode=Verbose script.py .