Как пройти через код Python, чтобы помочь отладить проблемы? - PullRequest
145 голосов
/ 08 февраля 2011

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

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

Ответы [ 12 ]

214 голосов
/ 08 февраля 2011

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

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

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

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

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

Если вы не хотите использовать отладчик командной строки, некоторыеВ таких средах, как Pydev , есть отладчик графического интерфейса.

43 голосов
/ 19 июня 2016

Используя Python Interactive Debugger 'pdb'

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

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

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

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

B. В переводчике

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

$ 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» (next)

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

  3. Бросить все… с помощью «q» (выйти)

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

    а) р а

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

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

  7. Вход в подпрограммы ... с «с» (шаг в)

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

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

    а) ! B = "B"

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

    а) перерыв белья № 1097 *

    b) имя функции прерывания

    c) имя файла перерыва: бельевой номер

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

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

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

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

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

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

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

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

36 голосов
/ 08 февраля 2011

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

import pdb
pdb.set_trace()

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

10 голосов
/ 27 августа 2018

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

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

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

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

7 голосов

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.

3 голосов
/ 08 февраля 2011

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

2 голосов
/ 29 мая 2019

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

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

2 голосов
/ 08 февраля 2011

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

1 голос
/ 26 августа 2015

https://wiki.python.org/moin/PythonDebuggingTools

pudb - хорошая замена для pdb

1 голос
/ 19 августа 2014

Visual Studio с PTVS может быть вариантом для вас: http://www.hanselman.com/blog/OneOfMicrosoftsBestKeptSecretsPythonToolsForVisualStudioPTVS.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...