#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.excepthook(type, value, traceback)
Эта функция выводит заданную трассировку и исключение для sys.stderr.
Когда возникает и не перехвачено исключение, интерпретатор вызывает sys.excepthook с тремя аргументами: класс исключения, экземпляр исключения и объект обратной трассировки. В интерактивном сеансе это происходит непосредственно перед тем, как управление возвращается в приглашение; в программе на Python это происходит непосредственно перед завершением программы. Обработку таких исключений верхнего уровня можно настроить, назначив другой функции с тремя аргументами
sys.excepthook
.
sys.__displayhook__
sys.__excepthook__
Эти объекты содержат исходные значения displayhook и excepthook в начале программы. Они сохраняются, чтобы displayhook и excepthook можно было восстановить в случае, если они будут заменены поврежденными объектами.
Вы также можете попробовать запустить ipython с --xmode
параметром, установленным на Plain
$ 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
Комментарии:
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
.