В Java/С# вы можете легко пройти по коду, чтобы отследить, что может быть не так, и IDE сделает этот процесс очень удобным для пользователя.
Можете ли вы проследить через код Python аналогичным образом?
В Java/С# вы можете легко пройти по коду, чтобы отследить, что может быть не так, и IDE сделает этот процесс очень удобным для пользователя.
Можете ли вы проследить через код Python аналогичным образом?
Да! Для этого есть отладчик 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 - бесплатная версия для сообщества.
Первый шаг - заставить интерпретатор 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://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/
В python имеется модуль под названием pdb. В верхней части вашего python script вы делаете
import pdb
pdb.set_trace()
и вы войдете в режим отладки. Вы можете использовать 's' для шага, n, чтобы следовать следующей строке, аналогичной тому, что вы делали бы с отладчиком 'gdb'.
Начиная с Python 3.7, вы можете использовать встроенную функцию breakpoint()
для входа в отладчик:
foo()
breakpoint() # drop into the debugger at this point
bar()
По умолчанию breakpoint()
импортирует pdb
и вызывает pdb.set_trace()
. Однако вы можете контролировать поведение отладки с помощью sys.breakpointhook()
и использования переменной окружения PYTHONBREAKPOINT
.
См. PEP 553 для получения дополнительной информации.
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
но вы, как правило, не хотите этого делать, потому что:
Или в качестве альтернативы, как в 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.
Если вы исходите из фона Java/С#, я полагаю, что лучше всего использовать Eclipse с Pydev. Это дает вам полностью функциональную IDE с встроенным отладчиком. Я также использую его с django.
В настоящее время существует метод breakpoint()
, который заменяет import pdb; pdb.set_trace()
.
Он также имеет несколько новых функций, таких как возможные переменные среды.
Если вы хотите IDE со встроенным отладчиком, попробуйте PyScripter.
Возможно также программное пошаговое и отслеживание через код python (и его легко!). Более подробную информацию смотрите в документации sys.settrace(). Также здесь - это учебник, который поможет вам начать работу.
Visual Studio с PTVS может быть для вас вариантом: http://www.hanselman.com/blog/OneOfMicrosoftsBestKeptSecretsPythonToolsForVisualStudioPTVS.aspx
https://wiki.python.org/moin/PythonDebuggingTools
pudb является хорошей заменой для pdb
PyCharm - это IDE для Python, включающая отладчик. Посмотрите это видео на YouTube, чтобы узнать, как использовать отладчик PyCharm для пошагового выполнения кода.
PyCharm Tutorial - отладка кода на Python с использованием PyCharm
Примечание. Это не является одобрением или обзором. PyCharm - это коммерческий продукт, за который нужно платить, но компания предоставляет бесплатную лицензию для студентов и преподавателей, а также "облегченную" версию Community, бесплатную и с открытым исходным кодом.
Python Tutor - онлайн одношаговый отладчик. Вы можете ввести код на странице редактирования и нажать "Визуализация выполнения", чтобы запустить его.
Вы можете посмотреть отладчик python, который делает именно то, что вы ищете, только не через графический интерфейс