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

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

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

Ответ 1

Да! Для этого есть отладчик 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, имеют отладчик с графическим интерфейсом. Wing и PyCharm являются коммерческими продуктами, но у Wing есть бесплатная версия "Personal", а у PyCharm - бесплатная версия для сообщества.

Ответ 2

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

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

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

Самый простой путь, запущенный из командной строки, интерпретатора 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)

С. Изнутри вашей программы

Для большого проекта и долговременного модуля можно запустить отладку изнутри программы, используя 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()

Пошаговая отладка, чтобы перейти на более внутреннюю

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

  • Повторение последней команды отладки... с помощью ВВОД

  • Выход из этого всего... с помощью "q" (выйти)

  • Печать значения переменных... с помощью "p" (печать)

    a) p a

  • Отключение приглашения (Pdb)... с помощью "c" (продолжение)

  • Увидеть, где вы... с "l" (список)

  • Выполнение подпрограмм... с помощью "s" (шаг в)

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

  • Назначьте новое значение

    a) ! b = "B"

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

    a) сломанный linenumber

    b) break functionname

    c) break имя_файла: linenumber

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

    a) tiny linenumber

  • Условная точка останова

    a) сломанный linenumber, условие

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

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

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

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

Ответ 3

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

import pdb
pdb.set_trace()

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

Ответ 4

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

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

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

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

Ответ 5

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.

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

Возможно также программное пошаговое и отслеживание через код python (и его легко!). Более подробную информацию смотрите в документации sys.settrace(). Также здесь - это учебник, который поможет вам начать работу.

Ответ 12

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

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

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

Screenshot

Ответ 14

Вы можете посмотреть отладчик python, который делает именно то, что вы ищете, только не через графический интерфейс