Более простой способ поставить точки останова PDB в коде Python?

105

Просто вопрос удобства. Я был немного избалован отладчиками в IDE, таких как Visual Studio и XCode. Мне кажется немного неуклюжим печататьimport pdb; pdb.set_trace() для установки точки останова (я бы предпочел не импортировать pdb в начало файла, так как я могу забыть и оставить его).

Есть ли более простой способ установить точку останова в коде Python, такой же простой и ненавязчивый, как то, что вы видите в IDE?

Джо
источник
Используйте PyCharm. Как это может быть проще, чем ввод строки с точкой останова, кроме запуска с использованием Python IDE?
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
Просто используйте python -m pdb <your_script>.py затем, b <line_number>чтобы установить точку останова на выбранном номере строки (без скобок для функций). Нажмите, cчтобы перейти к точке останова. Вы можете увидеть все свои точки останова, используя отдельную bкоманду. Введите, helpчтобы увидеть другие команды pdb, доступные во время отладки.
arcseldon
1
Начиная с Python 3.7, теперь вы можете использовать встроенную breakpoint()функцию. python.org/dev/peps/pep-0553
Дэниел

Ответы:

117

Вы можете запустить свою программу pdbиз командной строки, запустив

python -m pdb your_script.py

Он прервется на 1-й строке, тогда вы сможете добавить точку останова в любом месте вашего кода, используя breakкоманду, ее синтаксис:

b (reak) [[имя файла:] белье | функция [, условие]]

Он достаточно гибкий, чтобы дать вам возможность добавлять точку останова где угодно.

mdeous
источник
24
чтобы прояснить этот момент, если я pdb.set_trace()захожу в отладчик, использую lкоманду (список) и вижу, что я хочу установить точку останова в строке 27, я затем ввожу: b 27и отладчик установит точку останова в строке 27 (я обнаружил документация немного сложна для понимания, поэтому хотел добавить это уточнение).
benjaminmgross
9
Кроме того, если у вас есть объект xи вы хотите остановить его при fвызове его метода , вы можете сказать break x.f, а затем c(ontinue). Это работает, даже если объект находится в недоступном файле или был создан динамически, например, путем распаковки.
osa
2
При отладке после трассировки стека вы можете скопировать полный путь к модулю и добавить номер строки, напримерb /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596
действителен
58

Ты можешь использовать:

from pdb import set_trace as bp

code
code
bp()
code
code
Апогентус
источник
не уверен, почему такое лишнее алиасинг, но ;-). По какой-то причине моя IDE / Editor (vscode) была кобылой в этом AM и продолжает подчеркиваться. Ваш комментарий действительно помог мне. Хорошего дня!
MrMesees
Спасибо вам большое!
пришвартовался
Как я могу принудительно импортировать set_traceтолько когда я использую bp ()?
alper
39

В vim у меня для этого настроен макрос (в моем файле .vimrc):

map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

поэтому я могу просто нажать \ b (когда не в режиме вставки), и он добавляет точку останова после текущей строки, или \ B (обратите внимание на заглавную букву), и он помещает ее перед текущей строкой.

который, кажется, работает нормально. Большинство других «простых» редакторов программистов (emacs, sublimetext и т.д.) должны иметь аналогичные простые способы сделать это.

Изменить: на самом деле у меня есть:

au FileType python map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
au FileType python map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

что включает его только для исходных файлов Python. Вы можете легко добавить похожие строки для javascript или любого другого языка, который вы используете.

Обновление 2019 (Python 3.7+)

Python 3.7+ теперь имеет встроенную функцию, breakpoint()которая может заменить предыдущую import pdb; pdb.set_trace()в vim. Он по-прежнему работает так же.

Даниэль
источник
2
Хорошее решение, и добавленная строка также будет иметь правильный отступ, если у вас есть set autoindentв вашем файле .vimrc .
Jealie 01
Да, я не могу понять, почему большинство дистрибутивов не поставляются set autoindent(и с множеством других опций) в стандартной комплектации. Одна из первых вещей, которые я делаю с новой системой, - это добавляю лучший vimrc ...
Даниэль
1
Просто используйте vim с именем register! Сохраните строку, которую вы хотите поместить в буфер 'd' (как в d ebug), нажав "dyyи всякий раз, когда вам это нужно, просто сделайте "dpили "dP. Изучите регистры vim ! Они очень полезны и всегда поддерживаются!
полвоазул
как добавить: w после этого?
ji-ruh
Если пойти дальше концепции именованных регистров, вы можете записать макрос, выполнить необходимые операции и затем остановить макрос. Затем вставьте содержимое макроса в файл vimrc. Например, начать макрос с qd, а потом "dpвставить. Наконец, назначьте свои инструкции регистру, чтобы он всегда заполнялся при загрузке vim. Пример: let @d = 'oimport pdb; pdb.set_trace()k0:w' теперь просто используйте, @dкогда хотите вставить строку в файл. Вышеуказанное также сохраняет файл. Но вам придется записать свои собственные (а не копировать / вставить выше), поскольку задействованы специальные символы (для выхода и т. Д.).
arcseldon
27

Если вы не хотите вручную устанавливать точки останова каждый раз при запуске программы (в Python 3.2+), например, скажем, вы хотите напрямую создать точку останова в строке 3 и остановить выполнение там:

python -m pdb -c "b 3" -c c your_script.py

Следующая информация может помочь:

Если файл .pdbrc существует в домашнем каталоге пользователя или в текущем каталоге, он считывается и выполняется так, как если бы он был набран в приглашении отладчика. Это особенно полезно для псевдонимов. Если существуют оба файла, первым считывается тот, который находится в домашнем каталоге, и определенные там псевдонимы могут быть заменены локальным файлом.

Изменено в версии 3.2: .pdbrc теперь может содержать команды, продолжающие отладку, такие как continue или next. Раньше эти команды не работали.

Новое в версии 3.2: pdb.py теперь принимает параметр -c, который выполняет команды, как если бы они были заданы в файле .pdbrc, см. Команды отладчика.

AXO
источник
23

Я еще не пробовал, но они только что реализовали новую встроенную функцию breakpoint () в Python 3.7, что означает, что теперь вы можете вставить точку останова с помощью одного оператора:

breakpoint()
Билл
источник
1
Что касается Python 3.7, это ответ.
eric
10

Вот как вы могли бы использовать pdb в командной строке, ничего не реализуя в своем исходном коде (документация и другие онлайн-ресурсы не очень хорошо объясняют это программисту, который в прошлом использовал только визуальные отладчики):

Запустите pdb, набрав в командной строке следующее:

python -m pdb 'python_script'

Эта команда инициализирует pdb, и отладчик pdb остановится на первой строке вашего python_script и будет ждать ввода от вас:

(Pdb)

Это интерфейс для связи с отладчиком. Теперь вы можете указать здесь свои команды. В отличие от использования кнопок или сочетаний клавиш в визуальных отладчиках, здесь вы будете использовать команды для получения тех же результатов.

Вы можете перейти к следующей строке вашего кода с помощью команды «n» (далее):

(Pdb) n

Выполнение следующего отобразит номер строки и конкретный код в источнике:

> python_script(line number)method name
-> current line in the source code

Вы можете установить точку останова, указав номер строки в исходном коде.

(Pdb) b 50

Здесь отладчик настроен на останов в строке 50. Если других точек останова нет, точка останова в строке 50 будет первой, и на нее может ссылаться идентификатор точки останова, который в данном случае равен 1. Если вы добавите больше точек останова, они получат идентификаторы последовательно (например, 2, 3 и т. Д.)

После установки точки останова вы продолжите выполнение своей программы, пока pdb не достигнет точки останова следующим образом:

(Pdb) c

Как только вы доберетесь до точки останова, вы можете перейти к следующей строке с помощью команды n, как описано ранее. Если вы хотите проверить значения переменных, вы должны выполнить команду параметра следующим образом:

(Pdb) p variable_name

Если вам больше не нужна точка останова, вы можете очистить ее, передав идентификатор точки останова с помощью команды clear:

(Pdb) clear 1

Наконец, когда вы закончите с отладчиком, вы можете выйти из выполнения, как если бы вы выходили из интерпретатора командной строки python.

(Pdb) exit()

Я надеюсь, что это поможет любому начать работу с pdb. Вот список команд, которые можно использовать с отладчиком: pdb, так что вопросы и ответы

пикмат 涅
источник
4

Вы можете использовать среду IDE, которая поддерживает отладку Python, или можете попробовать отличный инструмент Winpdb. Это работает на любой платформе и предоставляет графические средства отладки для вашего скрипта Python.

http://winpdb.org/

Гленджамин
источник
2

Ты можешь использовать:

  • крыло идее
  • eclipse с плагином pydev
  • пихармы

Все вышеперечисленное поддерживает отладку python из среды IDE.

вватса
источник
0

В Atom, если установлены плагины Python, вы можете просто ввести 'pdb ' и нажать Enter, и фрагмент кода напечатает import и проследит за вами.

Я привык к этому сейчас, что иногда я просто набираю его, даже если я редактирую его в vim и жду появления раскрывающегося списка.

Симплекс
источник
0

Недооцененный метод - установить точку останова напрямую в pdb:

pdb> b torch/__init__:10

установит точку останова на site-packages\torch\__init__.py:10

Затем pdb> cостановимся на этой точке останова.

Следующие также действительны:

pdb> b d:\anaconda\lib\site-packages\torch\__init__.py:10
pdb> b torch\__init__.py:10
pdb> b d:\\anaconda\\lib\\site-packages\\torch\\__init__.py:10
pdb> b d:/anaconda/lib/site-packages/torch/__init__.py:10

См. Подробности в документе .

Совет за январь
источник
0

Вы можете использовать Vim с плагином Python-Mode или Emacs с Elpy плагином .

Эти плагины предоставляют вам точки останова с легким нажатием клавиш ( \ bв Vim и C-c C-u bEmacs), а также многие другие функции из тяжелых IDE (сворачивание кода, рефакторинг, линтинг и т. Д.) - все в легком текстовом редакторе на базе терминала.

Крис Абрахам
источник
-1

Самый простой способ запустить отладчик в вашем скрипте - это просто

pdb your_script.py

Запуск pdb в командной строке Linux дает

usage: pdb.py scriptfile [arg] ...
тимбо
источник
Как установить pdb? Или откуда?
kenorb