Как пройти через код Python, чтобы помочь отладить проблемы?

187

В Java / C # вы можете легко пройти по коду, чтобы отследить, что может быть не так, и IDE делают этот процесс очень удобным для пользователя.

Можете ли вы проследить через код Python аналогичным образом?

Бланкмэн
источник

Ответы:

264

Да! Для этого есть отладчик Python pdb!

Вы можете запустить программу на Python pdbс помощью pdb myscript.pyили python -m pdb myscript.py.

Затем вы можете выполнить несколько команд, которые описаны на pdbстранице.

Некоторые полезные для запоминания:

  • b: установить точку останова
  • c: продолжайте отладку, пока не достигнете точки останова
  • s: пройти через код
  • n: перейти к следующей строке кода
  • l: список исходного кода для текущего файла (по умолчанию: 11 строк, включая выполняемую строку)
  • u: перемещаться вверх по стеку
  • d: перейти вниз по стеку
  • p: напечатать значение выражения в текущем контексте

Если вы не хотите использовать отладчик командной строки, некоторые IDE, такие как Pydev , Wing IDE или PyCharm, имеют отладчик GUI. Wing и PyCharm являются коммерческими продуктами, но у Wing есть бесплатная версия «Personal», а у PyCharm - бесплатная версия для сообщества.

мит
источник
10
Вау, я не могу поверить, что мне трудно найти графический pdb для linux / ubuntu. Я что-то упускаю? Возможно, мне придется посмотреть на создание плагина SublimeText для него.
ThorSummoner
4
PyCharm довольно хорош в качестве графического отладчика, и его Community Edition бесплатно!
Питер
@ThorSummoner, pudbотлично подходит для этого. Такжеpydev
alpha_989
pdbне инструмент командной строки. Чтобы использовать это, используйте python -m pdb your_script.py.
января
@jdhao Думаю, это не стандартно, но в Ubuntu pdbкоманда входит в pythonпакет. В любом случае, python -m <module>становится стандартом для других вещей, таких как pip, так что, вероятно, лучше использовать это по умолчанию.
wjandrea
55

С помощью Python Interactive Debugger 'pdb'

Первый шаг - заставить интерпретатор Python войти в режим отладки.

A. из командной строки

Самый простой способ запуска из командной строки интерпретатора Python

$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)

Б. Внутри переводчика

Разрабатывая ранние версии модулей и экспериментируйте более итеративно.

$ python
Python 2.7 (r27:82508, Jul  3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)

C. Из вашей программы

Для большого проекта и долго работающего модуля, можете начать отладку изнутри программы, используя import pdb и set_trace () следующим образом:

#!/usr/bin/env python
# encoding: utf-8
#

import pdb

class MyObj(object):
    count = 5
    def __init__(self):
        self.count= 9

    def go(self):
        for i in range(self.count):
            pdb.set_trace()
            print i
        return

if __name__ == '__main__':
    MyObj(5).go()

Пошаговая отладка для более внутреннего

  1. Выполните следующий оператор ... с помощью «n» (следующий)

  2. Повторение последней команды отладки ... с помощью ENTER

  3. Бросить все это ... с «q» (выход)

  4. Печать значения переменных… с помощью «p» (печать)

    а) в год

  5. Отключение подсказки (Pdb)… с помощью «c» (продолжение)

  6. Видя, где вы находитесь ... с «л» (список)

  7. Вступая в подпрограммы ... с "S" (шаг в)

  8. Продолжая ... но только до конца текущей подпрограммы ... с "r" (возврат)

  9. Назначьте новое значение

    а) ! b = "B"

  10. Установить точку останова

    а) сломать белье

    б) нарушить имя функции

    в) прервать имя файла: белье

  11. Временная точка останова

    а) триммер белья

  12. Условная точка останова

    а) перерыв белья номер, состояние

Примечание: ** Все эти команды должны выполняться из ** pdb

Для углубленного знания, обратитесь: -

https://pymotw.com/2/pdb/

https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/

ДАК
источник
41

В python есть модуль pdb. В верхней части вашего скрипта Python вы делаете

import pdb
pdb.set_trace()

и вы войдете в режим отладки. Вы можете использовать 's' для перехода, 'n' для перехода к следующей строке, аналогично тому, что вы сделали бы с отладчиком 'gdb'.

Сентил Кумаран
источник
21

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

foo()
breakpoint()  # drop into the debugger at this point
bar()

По умолчанию breakpoint()будет импортировать pdbи звонить pdb.set_trace(). Однако вы можете управлять поведением отладки с помощью sys.breakpointhook()переменной окружения PYTHONBREAKPOINT.

См. PEP 553 для получения дополнительной информации.

Евгений Ярмаш
источник
2
Когда я увидел, breakpointя был взволнован. Но потом я узнал, что это по сути всего лишь ярлык, import pdb; pdb.set_trace()и это меня расстроило. Разработчики Python: пожалуйста, обратите внимание на улучшение PDB с помощью базовых функций GDB, таких как строки контекста, постоянная история команд и автозаполнение вкладок :-)
Сиро Сантилли
11

ipdb (отладчик IPython)

ipdb добавляет функциональность IPython в pdb, предлагая следующие ОГРОМНЫЕ улучшения:

  • завершение вкладки
  • показать больше строк контекста
  • подсветка синтаксиса

Как и в случае с pdg, ipdb по-прежнему далек от совершенства и является полностью элементарным по сравнению с GDB, но это уже огромное улучшение по сравнению с pdb.

Использование аналогично pdb, просто установите его с помощью:

python3 -m pip install --user ipdb

а затем добавьте в строку, из которой вы хотите выполнить отладку:

__import__('ipdb').set_trace(context=21)

Вы, вероятно, хотите добавить ярлык для этого из вашего редактора, например, для Vim snipmate, который у меня есть:

snippet ipd
    __import__('ipdb').set_trace(context=21)

так что я могу печатать просто, ipd<tab>и он расширяется до точки останова. Тогда удалить его легко, ddпоскольку все содержится в одной строке.

context=21увеличивает количество строк контекста, как описано в разделе : Как я могу заставить ipdb показывать больше строк контекста при отладке?

Кроме того, вы также можете отлаживать программы с самого начала с помощью:

ipdb3 main.py

но вы, как правило, не хотите этого делать, потому что:

  • вам придется пройти через все определения функций и классов, когда Python читает эти строки
  • Я не знаю, как установить размер контекста без взлома ipdb. Патч для разрешения: https://github.com/gotcha/ipdb/pull/155

Или же, как в raw pdb 3.2+, вы можете установить некоторые точки останова из командной строки:

ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py

хотя -c cпо какой-то причине не работает: https://github.com/gotcha/ipdb/issues/156

python -m moduleОтладка была задана по адресу: Как отладить модуль Python, запущенный с python -m из командной строки? и так как Python 3.7 можно сделать с:

python -m pdb -m my_module

Серьезные недостающие возможности как pdb, так и ipdb по сравнению с GDB:

Особые неприятности ipdb:

Протестировано в Ubuntu 16.04, ipdb == 0.11, Python 3.5.2.

Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
источник
5

В breakpoint()настоящее время существует метод, который заменяет import pdb; pdb.set_trace().

Он также имеет несколько новых функций , таких как возможные переменные среды.

johnnyheineken
источник
3

Если вы пришли из Java / C # фона, я думаю, что вам лучше всего было бы использовать Eclipse с Pydev . Это дает вам полностью функциональную IDE со встроенным отладчиком. Я также использую его с django.

Liorsion
источник
2

Если вам нужна IDE со встроенным отладчиком, попробуйте PyScripter .

Kindall
источник
2

Python Tutor - это онлайн одношаговый отладчик, предназначенный для новичков. Вы можете вставить код на редактирование странице нажать «Визуализация выполнения», чтобы запустить его.

Помимо прочего, он поддерживает:

Однако он также не поддерживает много вещей , например:

  • Чтение / запись файлов - используйте io.StringIOи io.BytesIOвместо этого: demo
  • Код, который слишком велик, выполняется слишком долго или определяет слишком много переменных или объектов
  • Аргументы командной строки
  • Много стандартных библиотечных модулей, таких как argparse, csv, enum, html, os, struct, weakref ...
wjandrea
источник
1

Программный переход и отслеживание кода Python также возможны (и это легко!). Посмотрите документацию sys.settrace () для более подробной информации. Также вот учебник, чтобы вы начали.

самоучка
источник
1

PyCharm - это IDE для Python, включающая отладчик. Посмотрите это видео на YouTube, чтобы узнать, как использовать отладчик PyCharm для пошагового выполнения кода.

PyCharm Tutorial - отладка кода Python с использованием PyCharm

Примечание: это не предназначено для одобрения или обзора. PyCharm - это коммерческий продукт, за который нужно платить, но компания предоставляет бесплатную лицензию для студентов и преподавателей, а также «облегченную» версию Community, бесплатную и с открытым исходным кодом.

Скриншот

Джим
источник