Это вопрос, который меня интересовал уже довольно давно, но я так и не нашел подходящего решения. Если я запускаю скрипт и сталкиваюсь, скажем, с IndexError, python печатает строку, местоположение и краткое описание ошибки и завершает работу. Можно ли автоматически запускать pdb при возникновении ошибки? Я не против наличия дополнительного оператора import в верхней части файла или нескольких дополнительных строк кода.
217
Ответы:
Вы можете использовать traceback.print_exc для печати трассировки исключений. Затем используйте sys.exc_info для извлечения трассировки и, наконец, вызовите pdb.post_mortem с этой трассировкой
Если вы хотите запустить интерактивную командную строку с code.interact, используя локали фрейма, где возникло исключение, вы можете сделать
источник
code
более ,pdb
поскольку последний , кажется, расширить на прежний?code
?sys.exc_info
чтобы извлечь трассировку и, наконец, вызватьpdb.post_mortem
эту трассировку . Вам не нужно передавать объект трассировкиpdb.post_mortem
. Из документов : Если трассировка не задана, используется исключение, которое обрабатывается в настоящее время (исключение должно быть обработано, если используется значение по умолчанию).Если вы не предоставите
-c continue
флаг, то вам нужно будет ввести 'c' (для продолжения), когда начнется выполнение. Затем он дойдет до точки ошибки и даст вам контроль там. Как уже упоминалось в eqzx , этот флаг является новым дополнением в Python 3.2, поэтому ввод 'c' необходим для более ранних версий Python (см. Https://docs.python.org/3/library/pdb.html ).источник
gdb
; и когда вы вводите 'r'pdb
, программа действительно запускается, но НЕ останавливается (и не генерирует обратную трассировку) при ошибке; меня озадачило, пока я не прочитал это. Ура!ipdb
; и, конечно, аргументы могут быть добавлены после сценария!Используйте следующий модуль:
Назовите это
debug
(или как вам нравится) и поместите его где-нибудь в вашем пути к Python.Теперь, в начале вашего сценария, просто добавьте
import debug
.источник
try-catch
что является просто уродливым ИМО.pudb
большеpdb
. Продолжайте возвращаться к копированию и вставке, что наверняка говорит о неупорядоченности в моей жизни.Ipython имеет команду для переключения этого поведения: % pdb . Он делает именно то, что вы описали, может быть, даже немного больше (дает вам более информативные обратные следы с подсветкой синтаксиса и дополнением кода). Это определенно стоит попробовать!
источник
%debug
позволяет открыть отладчик после возникновения ошибки. Я часто предпочитаю это%pdb
. (Компромисс будет только набиратьq
каждый раз , когда вы не хотите , чтобы отладить vs. опечатка%debug
каждый раз , когда вы делаете хотите отладить ошибку.)c.InteractiveShell.pdb = True
в свою очередьipython_config.py
включается%pdb
автоматически для каждого сеанса.Это не отладчик, но, вероятно, так же полезен (?)
Я знаю, что слышал, как Гвидо упоминал об этом в своей речи.
Я только что проверил python -?, И если вы используете команду -i, вы можете взаимодействовать там, где остановился ваш скрипт.
Итак, учитывая этот сценарий:
Вы можете получить этот вывод!
Честно говоря, я не использовал это, но я должен быть, кажется очень полезным.
источник
IPython делает это простым в командной строке:
можно переписать на
Или, аналогично, при вызове модуля:
можно переписать на
Обратите внимание
--
чтобы IPython не считывал аргументы скрипта как свои собственные.Это также имеет преимущество вызова расширенного отладчика IPython (ipdb) вместо pdb.
источник
Если вы используете
ipython
, после запуска типа%pdb
источник
Если вы используете среду IPython, вы можете просто использовать% debug, и оболочка вернет вас к вызывающей проблемы среде со средой ipdb для проверок и т. Д. Другой вариант, как указано выше, - это использовать iPython magic% pdb, который эффективно тот же самый.
источник
up
иdown
командами , чтобы вернуться к строке кода , который сгенерировал ошибку.Вы можете поместить эту строку в свой код:
Больше информации: Запустите отладчик Python в любой строке
источник
Чтобы запустить его без необходимости вводить c в начале, используйте:
Pdb имеет свои собственные аргументы командной строки: -cc выполнит команду c (ontinue) в начале выполнения, и программа будет работать непрерывно до появления ошибки.
источник
python -m pdb script.py в python2.7 нажмите продолжить, чтобы запустить, и это приведет к ошибке и прекратит работу для отладки.
источник
Если вы используете модуль:
И теперь вы хотите ввести,
pdb
когда возникает исключение, сделайте это:(или продли свой
PYTHONPATH
). ЭтоPYTHONPATH
необходимо для того, чтобы модуль был найден в пути, поскольку вы сейчас запускаетеpdb
модуль.источник
Поместите точку останова в конструктор верхнего класса исключений в иерархии, и в большинстве случаев вы увидите, где возникла ошибка.
Установка точки останова означает, что вы хотите, чтобы она означала: вы можете использовать IDE, или
pdb.set_trace
, или как угодноисточник