Простіший спосіб встановити точки прориву PDB в код Python?


105

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

Чи є простіший спосіб встановлення точки розриву в коді Python, такий же простий і ненав’язливий, як те, що ви бачите в IDE?


Використовуйте PyCharm. Як це може бути простіше, ніж введення лінії перерви, за винятком запуску з використанням IDE Python?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Просто використовуйте 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) [[ім'я файлу:] lineno | функція [, умова]]

Це досить гнучко, щоб дати вам можливість додавати точку перерви в будь-якому місці.


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 / редактор (vscode) був кобилом цього AM та продовжує підкреслювати. Побачивши ваш коментар, мені дуже допомогло. Гарного дня!
MrMesees

Дуже дякую!
пришвартовано

Як я можу змусити імпортувати set_traceлише тоді, коли я використовую bp ()?
Альпер

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()in vim. Він все одно працює так само.


2
Хороший розчин, і додав лінія матиме правильний відступ теж , якщо у вас є set autoindentу вашому .vimrc файл.
Джалі

Так, я не можу зрозуміти, чому більшість дистрибутивів не постачаються set autoindent(та ще купа інших варіантів) як стандарт. Одне з перших речей, які я роблю з новою системою, - це втягнути кращий vimrc ...
Даніель

1
Просто використовуйте реєстр з назвою vim! Збережіть рядок, який ви хочете запанувати "d" (як у d ebug), натискаючи "dyyта, коли вам це потрібно, просто зробіть "dpабо "dP. Вивчайте регістри vim ! Вони дуже корисні і завжди підтримуються!
polvoazul

як додати: w після цього?
джи-рух

Зробивши трохи далі названу концепцію регістра, ви можете записати макрос, виконати необхідні операції, а потім зупинити макрос. Потім вставте вміст макросу у файл 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 тепер може містити команди, які продовжують налагодження, такі як продовжити чи наступну. Раніше ці команди не мали ефекту.

Нове у версії 3.2: pdb.py тепер приймає опцію -c, яка виконує команди так, як якщо б вони були задані у файлі .pdbrc, див. Команди налагодження.



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

Якщо вам більше не потрібна точка перерви, ви можете очистити її, ввівши ідентифікатор точки розриву за допомогою чіткої команди:

(Pdb) clear 1

Нарешті, коли ви закінчите з налагоджувачем, ви можете вийти з виконання, як ви вийшли з інтерпретатора командного рядка python.

(Pdb) exit()

Я сподіваюся, що це допоможе комусь розпочати роботу з pdb. Ось перелік команд, якими ви можете скористатися з налагоджувачем: pdb так запитання та відповіді



4

Ви можете використовувати IDE, який підтримує налагодження python, або ви можете перевірити відмінний інструмент Winpdb. Яка працює на будь-якій платформі та надає засоби графічної налагодження вашому сценарію python.

http://winpdb.org/


2

Ви можете використовувати:

  • крило іде
  • затемнення з плагіном pydev
  • піхарми

Усі перелічені вище підтримують налагодження пітона зсередини IDE.


0

У Atom, якщо плагіни Python встановлені, ви можете просто ввести ' pdb' і натисніть клавішу Enter, і фрагмент набере імпорт та відстеження назад для вас.

Я звик до цього, що іноді просто ввожу це, навіть якщо я редагую його in 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.