Программы написанные на python можно запускать и отлаживать даже с неверно написанной частью кода

В разработке программного обеспечения отладка – это процесс поиска и решения проблем, препятствующих правильной работе программного обеспечения.

Встроенный отладчик Python предоставляет специальную среду для поиска багов в программах Python. Отладчик поддерживает установку условных точек останова, пошаговое или построчное выполнение исходного кода, проверку стека и многое другое.

Интерактивное взаимодействие с отладчиком Python

Отладчик входит в стандартную установку Python как модуль pdb. Он расширяемый, его можно использовать как класс Pdb.

Для начала создайте простую программу looping.py с глобальными переменными, функцией, которая создаёт вложенный цикл, и конструкцией if __name__ == ‘__main__’: для вызова функции nested_loop().

num_list = [500, 600, 700] alpha_list = [‘x’, ‘y’, ‘z’] def nested_loop():
for number in num_list:
print(number)
for letter in alpha_list:
print(letter)
if __name__ == ‘__main__’:
nested_loop()

На что способен PYTHON

Запустите программу в отладчике Python.

python -m pdb looping.py

Флаг -m импортирует любой модуль Python и запускает его как сценарий. В данном случае нужно импортировать и запустить модуль pdb.

Команда вернёт следующий результат:

> /Users/8host/looping.py(1)()
-> num_list = [500, 600, 700] (Pdb)

Первая строка вывода содержит имя текущего модуля (), путь к каталогу и номер строки (в данном случае это 1, но при наличии комментариев или неисполняемых строк номер будет выше). Вторая строка показывает текущую строку исходного кода, которая была выполнена (pdb предоставляет интерактивную консоль для отладки). Вы можете использовать команду help, чтобы узнать другие команды; чтобы узнать больше о конкретной команде, введите:

Обратите внимание, что консоль pdb отличается от интерактивной оболочки Python.

Отладчик Python автоматически запустится, когда он достигнет конца проверяемой программы. Чтобы закрыть консоль pdb, введите команду quit или exit. Чтобы явно перезапустить программу, используйте команду run.

Перемещение по программе

При работе с программами в отладчике Python для перемещения по коду используются команды list, step и next. Рассмотрим эти команды подробнее.

Команда list позволяет получить контекст текущей строки. К примеру, в случае с первой строкой программы looping.py, (num_list = [500, 600, 700]) результат будет выглядеть так:

(Pdb) list
1 -> num_list = [500, 600, 700] 2 alpha_list = [‘x’, ‘y’, ‘z’] 3
4
5 def nested_loop():
6 for number in num_list:
7 print(number)
8 for letter in alpha_list:
9 print(letter)
10
11 if __name__ == ‘__main__’:
(Pdb)

Текущая строка обозначена символом ->.

Это довольно простая и короткая программа, потому команда вернула почти все её строки. Без аргументов команда list предоставляет 11 строк вокруг текущей строки. Однако вы также можете указать строки, которые нужно отобразить.

Самый БЫСТРЫЙ стандартный цикл Python − Интеграция с языком Си

(Pdb) list 3, 7
3
4
5 def nested_loop():
6 for number in num_list:
7 print(number)
(Pdb)

Аргументы list 3, 7 выведут фрагмент с 3 по 7 строку программы.

Построчное перемещение по программе выполняется с помощью step или next.

(Pdb) step
> /Users/8host/looping.py(2)()
-> alpha_list = [‘x’, ‘y’, ‘z’] (Pdb)
(Pdb) next
> /Users/8host/looping.py(2)()
-> alpha_list = [‘x’, ‘y’, ‘z’] (Pdb)

Команда step останавливается на заданной функции, а команда next выполняет переданную ей функцию и останавливается на следующей строке.

К примеру, команда step выполнит итерацию по циклам, когда она дойдет до выполнения функции. Она покажет, что именно делает цикл: сначала она выведет число с помощью print(number), а затем выведет буквы с помощью print(letter).

(Pdb) step
> /Users/8host/looping.py(5)()
-> def nested_loop():
(Pdb) step
> /Users/8host/looping.py(11)()
-> if __name__ == ‘__main__’:
(Pdb) step
> /Users/8host/looping.py(12)()
-> nested_loop()
(Pdb) step
—Call—
> /Users/8host/looping.py(5)nested_loop()
-> def nested_loop():
(Pdb) step
> /Users/8host/looping.py(6)nested_loop()
-> for number in num_list:
(Pdb) step
> /Users/8host/looping.py(7)nested_loop()
-> print(number)
(Pdb) step
500
> /Users/8host/looping.py(8)nested_loop()
-> for letter in alpha_list:
(Pdb) step
> /Users/8host/looping.py(9)nested_loop()
-> print(letter)
(Pdb) step
x
> /Users/8host/looping.py(8)nested_loop()
-> for letter in alpha_list:
(Pdb) step
> /Users/8host/looping.py(9)nested_loop()
-> print(letter)
(Pdb) step
y
> /Users/8host/looping.py(8)nested_loop()
-> for letter in alpha_list:
(Pdb)

Команда next выполнит функцию, не показывая пошагово каждого этапа процесса. Остановите текущую сессию с помощью команды exit и снова запустите отладчик.

python -m pdb looping.py

Запустите команду next:

(Pdb) next
> /Users/8host/looping.py(5)()
-> def nested_loop():
(Pdb) next
> /Users/8host/looping.py(11)()
-> if __name__ == ‘__main__’:
(Pdb) next
> /Users/8host/looping.py(12)()
-> nested_loop()
(Pdb) next
500
x
y
z
600
x
y
z
700
x
y
z
—Return—
> /Users/8host/looping.py(12)()->None
-> nested_loop()
(Pdb)

Перемещаясь по коду программы, вы можете изучит значения переменных с помощью команды pp, которая предоставит структурную распечатку операторов при помощи модуля pprint.

(Pdb) pp num_list
[500, 600, 700] (Pdb)

Большинство команд pdb имеют более короткие псевдонимы. Для команды step это s, а для next – n. Команда help выведет список доступных псевдонимов.

Чтобы вызвать последнюю вызванную команду, просто нажмите клавишу Enter в командной строке.

Точки останова

Как правило, код программ гораздо объёмнее, чем код в приведённом выше примере. Чтобы просмотреть определённые функции, строки или фрагменты программы, используйте команду break. Она устанавливает точки останова, и отладчик будет проверять код только внутри этих точек.

Отладчик присваивает точкам останова порядковые номера, начиная с 1. По этим номерам на точки можно ссылаться.

Точки останова можно разместить в строках с определённым номером с помощью синтаксиса ::

(Pdb) break looping.py:5
Breakpoint 1 at /Users/8host/looping.py:5
(Pdb)

Чтобы удалить все текущие точки останова, введите clear и y.

Также точку останова можно разместить по функции:

(Pdb) break looping.nested_loop
Breakpoint 1 at /Users/8host/looping.py:5
(Pdb)

Чтобы удалить текущую точку, введите clear и y.

Также можно создать условие:

(Pdb) break looping.py:7, number > 500
Breakpoint 1 at /Users/8host/looping.py:7
(Pdb)

Если сейчас запустить команду continue, программа остановится, когда значение number x станет больше 500 (то есть, во время второй итерации цикла).

(Pdb) continue
500
x
y
z
> /Users/8host/looping.py(7)nested_loop()
-> print(number)
(Pdb)

Вывести список точек останова можно с помощью команды break без аргументов.

(Pdb) break
Num Type Disp Enb Where
1 breakpoint keep yes at /Users/8host/looping.py:7
stop only if number > 500
breakpoint already hit 2 times
(Pdb)

Чтобы отключить точки останова, используйте команду disable и укажите номер точки. Добавьте новую точку и отключите первую:

(Pdb) break looping.py:11
Breakpoint 2 at /Users/8host/looping.py:11
(Pdb) disable 1
Disabled breakpoint 1 at /Users/8host/looping.py:7
(Pdb) break
Num Type Disp Enb Where
1 breakpoint keep no at /Users/8host/looping.py:7
stop only if number > 500
breakpoint already hit 2 times
2 breakpoint keep yes at /Users/8host/looping.py:11
(Pdb)

Включить точку можно с помощью команды enable, а удалить – с помощью clear.

(Pdb) enable 1
Enabled breakpoint 1 at /Users/8host/looping.py:7
(Pdb) clear 2
Deleted breakpoint 2 at /Users/8host/looping.py:11
(Pdb)

Читайте также:
Что такое реферальная программа 5

Точки останова в pdb предоставляют большой контроль над кодом программы. Отладчик может игнорировать точки останова во время текущей итерации программы с помощью команды ignore (например, ignore 1), запускать действия, происходящие в точке останова и создавать временные точки останова (команда tbreak ), которые будут автоматически сброшены после первой проверки.

Интеграция отладчика pdb в программу

Чтобы запустить сеанс отладки, импортируйте модуль pdb и добавьте функцию pdb.set_trace () перед строкой, с которой нужно начать проверку.

В приведенную выше программу можно добавить оператор import и функцию, которая запустит отладчик. Например, добавьте его перед вложенным циклом.

# Import pdb module
import pdb
num_list = [500, 600, 700] alpha_list = [‘x’, ‘y’, ‘z’] def nested_loop():
for number in num_list:
print(number)
# Trigger debugger at this line
pdb.set_trace()
for letter in alpha_list:
print(letter)
if __name__ == ‘__main__’:
nested_loop()

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

Импорт модуля pdb и функция pdb.set_trace() позволяют запустить программу как обычно.

Изменение потока выполнения программы

Отладчик Python позволяет изменять поток программы во время выполнения с помощью команды jump. Это позволяет пропустить фрагменты программы, предотвратить запуск какого-либо кода или вернуться назад, чтобы снова запустить код.

Рассмотрим эту функцию на примере небольшой программы, которая создает список букв, содержащихся в строке 8host = “8host”:

def print_8host():
8host_list = [] 8host = «8host»
for letter in 8host:
8host_list.append(letter)
print(8host_list)
if __name__ == «__main__»:
print_8host()

python letter_list.py
[‘8’] [‘8’, ‘h’] [‘8’, ‘h’, ‘o’] [‘8’, ‘h’, ‘o’, ‘s’] [‘8’, ‘h’, ‘o’, ‘s’, ‘t’]

С помощью отладчика Python можно изменить выполнение программы, пропустив один цикл. Это прервёт цикл for.

python -m pdb letter_list.py
> /Users/8host/letter_list.py(1)()
-> def print_8host():
(Pdb) list
1 -> def print_8host():
2 8host_list = [] 3 8host = «8host»
4 for letter in 8host:
5 8host_list.append(letter)
6 print(8host_list)
7
8 if __name__ == «__main__»:
9 print_8host()
10
11
(Pdb) break 5
Breakpoint 1 at /Users/8host/letter_list.py:5
(Pdb) continue
> /Users/8host/letter_list.py(5)print_8host()
-> 8host_list.append(letter)
(Pdb) pp letter
‘8’
(Pdb) continue
[‘8’] > /Users/8host/letter_list.py(5)print_8host()
-> 8host_list.append(letter)
(Pdb) jump 6
> /Users/8host/letter_list.py(6)print_8host()
-> print(8host_list)
(Pdb) pp letter
‘h’
(Pdb) disable 1
Disabled breakpoint 1 at /Users/8host/letter_list.py:5
(Pdb) continue
[‘8’] [‘8’, ‘o’] [‘8’, ‘o’, ‘s’] [‘8’, ‘o’, ‘s’, ‘t’]

В этой сессии отладчик прервёт обработку кода на строке 5, а затем возобновит процесс обработки (также он выведет некоторые значения, чтобы вы могли отслеживать действия). Затем команда jump перепрыгнет на строку 6. В этот момент переменная letter имеет значение а, но код, который отвечает за её отображение, пропущен. Затем точка останова отключается с помощью команды continue, потому значение a не включено в вывод.

Закройте сессию и перезапустите отладчик. Попробуйте вернуться к предыдущему фрагменту программы с помощью jump. Например, можно дважды запустить первую итерацию цикла for.

> /Users/8host/letter_list.py(1)()
-> def print_8host():
(Pdb) list
1 -> def print_8host():
2 8host_list = [] 3 8host = «8host»
4 for letter in 8host:
5 8host_list.append(letter)
6 print(8host_list)
7
8 if __name__ == «__main__»:
9 print_8host()
10
11
(Pdb) break 6
Breakpoint 1 at /Users/8host/letter_list.py:6
(Pdb) continue
> /Users/8host/letter_list.py(6)print_8host()
-> print(8host_list)
(Pdb) pp letter
‘8’
(Pdb) jump 5
> /Users/8host/letter_list.py(5)print_8host()
-> 8host_list.append(letter)
(Pdb) continue
> /Users/8host/letter_list.py(6)print_8host()
-> print(8host_list)
(Pdb) pp letter
‘8’
(Pdb) disable 1
Disabled breakpoint 1 at /Users/8host/letter_list.py:6
(Pdb) continue
[‘8’, ‘8’] [‘8’, ‘8’, ‘h’] [‘8’, ‘8’, ‘h’, ‘o’] [‘8’, ‘8’, ‘h’, ‘o’, ‘s’] [‘8’, ‘8’, ‘h’, ‘o’, ‘s’, ‘t’]

В приведённой выше сессии отладки выполнение кода остановилось на строке 6, затем программа вернулась к строке 5 и продолжила обработку. Затем точка останова в строке 6 была отключена, после чего программа продолжила выполнение. Результат показывает два значения ‘8’ в 8host_list.

Некоторые пропуски и изменения потока программы предотвращает сам отладчик (особенно это касается тех фрагментов кода, которые определяют значения в дальнейшем потоке программы). К примеру, вы не сможете пропустить функции, если аргументы не определены, перейти к середине блока try:except или пропустить блок finally.

Общие команды pdb

Здесь вы найдёте таблицу полезных команд pdb, которые часто используются при работе с отладчиком Python.

Команда

Краткая форма

Действие

Больше информации можно найти в документации отладчика Python.

Заключение

Отладка – важный этап разработки любого программного обеспечения. Встроенный отладчик pdb предоставляет интерактивную среду для обнаружения и отладки неисправностей и ошибок в коде программы.

Источник: www.8host.com

Профилирование и отладка Python, отладка

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

Сегодня я предлагаю рассмотреть методы отладки программ.

  • Введение и теория — зачем вообще нужно профилирование, различные подходы, инструменты и отличия между ними
  • Ручное и статистическое профилирование — переходим к практике
  • Событийное профилирование — инструменты и их применение
  • Отладка — что делать, когда ничего не работает

Прежде, чем начинать разговор об отладке, нам нужно определиться, что же это такое. По традиции, обратимся к Википедии: «Отладка — обнаружение, локализация и устранение ошибок». Вообще, для успешной отладки программы, нам необходимо (но не всегда достаточно) две вещи: значение переменных в том месте программы, в котором произошла ошибка, а так же стектрейс: порядок вызова функций, вплоть до ошибочной. Полезно так же знать об окружении, в котором выполняется программа: наличие (или отсутствие) свободной памяти, системные ограничения (например, на количество файловых дескрипторов) и так далее, но это слегка выходит за пределы нашей статьи.

Классика жанра

Что делает начинающий программист, когда хочет «проникнуть» внутрь программы и изучить содержимое переменных (в нужных местах) и логику работы программы (вызовы функций, выполнение условий)? Он прибегает к самому распространённому, самому простому и самому «действенному» способу отладки: расставляет по всему коду «принты» (оператор print в Python 2.x и функция print() в Python 3.x). Но не только начинающие грешат этим: продвинутые разработчики частенько ленятся использовать специальные инструменты для отладки, надеясь быстренько, за пару минут, найти причину ошибки и всё исправить, и не замечая, что поиски ошибок растягиваются на часы и даже дни. Кстати, такой подход называют «журналированием».

Сюда же относится запись всей нужной для отладки программы информации в лог-файл. Иногда других вариантов нет, например, когда скрипт работает в продакшене и ошибки возникают эпизодически, или когда ошибка проявляется только после долгой работы программы (скажем, через две-три недели после запуска).

Но мы же пишем на Python, так почему бы не воспользоваться встроенными средствами отладки или инструментами, предлагаемыми сообществом? Например, вместо обычного логгирования в файл имеет смысл использовать Sentry, чтобы кроме сообщения об ошибке можно было отправить дополнительную информацию: стектрейс со всеми локальными переменными, любые другие переменные и вообще всё, что посчитаете нужным.

The Python Debugger

Python имеет встроенный отладчик: модуль pdb. В принципе, на этом можно было бы закончить статью, т.к. pdb — чрезвычайно мощный отладчик и всё остальное, по сути, всего лишь «украшательства» к нему. Но мы продолжим =)

Читайте также:
Как по английски детские программы

Как можно заметить из названия, pdb многое взял от gdb (GNU Project debugger) — отладчика Си (и не только) программ. К слову, программы на Python можно отлаживать и с помощью gdb, просто это немножко сложнее и дольше, хотя тем, кто хочет углубиться в устройство языка, а так же тем, кто пишет сишные модули для питона без gdb никак не обойтись. Кроме того, gdb позволяет подключиться к уже работающей программе (через её pid) и заниматься её отладкой «прямо на месте».

Я сейчас не буду подробно описывать pdb, вот замечательная статья Дага Хеллманна (Doug Hellmann): pdb – Interactive Debugger на очень полезном ресурсе Python Module of the Week, а вот её хороший перевод на хабре: pdb – Интерактивный отладчик, выполненный пользователем xa4a.

IPython pdb


Предлагаю сразу поставить IPython и модуль ipdb для него:

➜ pip install ipython ipdb

IPython (и ipdb, как его часть) предлагает «более лучшую» консоль и, как следствие, более удобную отладку программ: подсветка кода, автодополнение, историю команд, динамическую интроспекцию любых объектов, магические функции, алиасы и многое другое. Полный список улучшений можно посмотреть в документации или прямо из консоли IPython, введя «?» в качестве команды. Всё это помогает при отладке и делает её простой и увлекательной.

Запустить отладку скрипта в ipdb можно несколькими способами:

➜ python -m ipdb script.py
➜ ipdb script.py

Эти команды откроют программу в отладчике, дальше можно делать всё, что угодно: ставить брейкпоинты, изучать её работу по шагам или просто запустить программу — отладчик автоматически остановится при возникновении неотловленного исключения.

Но обычно такой вариант чересчур изнурителен: пока доберёшься до нужного места всеми этими «next», «step», да и ставить точку останова («break») руками каждый раз утомительно. Гораздо удобнее в нужном месте программы вставить следующую строку:

import ipdb; ipdb.set_trace()

И тогда при исполнении этой строки выполнение программы приостановится и будет запущен отладчик, — дальше можно начинать углубляться в изучение программы. По сути, функция «set_trace» — это установка точки останова (breakpoint).

Примечание для эстетов

Любой, кому знакома аббревиатура PEP8, в этом месте может обвинить меня в использовании двух команд в одной строке через точку с запятой, однако такой подход вполне имеет право на жизнь. Во-первых, это временный код, который никогда не будет закоммичен в репозиторий (об этом позаботится специальный хук, который проверяет код на соответствие PEP8 перед коммитом и пушем, а так же автопроверка кода в текстовом редакторе). Во-вторых, так проще вставлять и удалять эту строку в код. Ну и в-третьих, как написано в PEP8: «A Foolish Consistency is the Hobgoblin of Little Minds».

Python Debugger имеет ещё один режим работы, который в некоторых случаях оказывается удобнее фукнции set_trace. Он называется «post mortem»: запуск отладчика с заданным трейсбеком:

try: some_code() except: import sys import ipdb tb = sys.exc_info()[2] ipdb.post_mortem(tb)
import sys import ipdb def run_debugger(type, value, tb): ipdb.pm() sys.excepthook = run_debugger some_code()

В случае возникновения любых неотлавливаемых исключений в функции «some_code» будет вызван отладчик в том месте программы, где произошло исключение.

debug

Интересной заменой функции «set_trace» является модуль debug, который просто импортирует библиотеки ipdb и see (удобная альтернатива функции dir) и запускает отладку. Единственным плюсом модуля является удобство использования, достаточно в любом месте программы вставить строку:

import debug

И при выполнении этой строки будет вызван отладчик «ipdb» и импортирован модуль «see».

ipdbplugin

Ещё одна интересная и, на этот раз, полезная библиотека: nose-ipdb. С её помощью можно автоматически запускать отладчик при ошибках (исключениях) или же просто при неверно отработанных тестах (я надеюсь, вы используете nose? =). Для запуска отладчика ipdb при ошибках, достаточно при запуске тестов добавить ключ «—ipdb»:

➜ nosetests —ipdb

А для запуска отладчика при некорректно завершившихся тестов нужно добавить ключ «—ipdb-failures»:
➜ nosetests —ipdb-failures

Конечно, можно ловить всё и сразу:
➜ nosetests —ipdb —ipdb-failures

Я каждый день использую этот модуль и просто не представляю себе жизни без него.

werkzeug

Потрясающий проект Армина Ронахера (Armin Ronacher), автора фреймворка Flask и вообще одного из крутейших программистов Python называется werkzeug и представляет собой сборник различных утилит для WSGI приложений. Одна из них — клёвый отладчик, который позволяет выводить удобный трейсбек ошибки, а так же запускать консоль Python в соответствующем месте трейсбека прямо на странице браузера:

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

from werkzeug.debug import DebuggedApplication from myapp import app app = DebuggedApplication(app, evalex=True)

Говорят, что werkzeug умеет отлаживать даже Ajax-запросы, но, к сожалению, я сам лично никогда этого не делал. Буду рад любым комментариям на эту тему.

django-pdb

Ещё один хороший модуль, на этот раз для Django: django-pdb. Он позволяет запускать отладчик при наличии соответствующего GET-параметра в запросе (например: http://127.0.0.1:8000/app/view?ipdb) либо для всех запросов:

➜ python manage.py runserver —ipdb

Либо вызывать отладчик при возникновении исключений (режим «post-mortem»):
➜ python manage.py runserver —pm
POST_MORTEM = True

django-extensions

Но гораздо лучше в Django использовать модуль django-extensions, который добавляет очень полезную команду runserver_plus. С помощью этой батарейки можно подружить Django и Werkzeug (см. выше) и начать получать удовольствие от страниц с пятисотой ошибкой =)

Для использования всего этого чуда достаточно запустить девелоперский сервер с помощью команды runserver_plus:

➜ python manage.py runserver_plus

sentry

Отладка программы в девелоперском окружении это, конечно, удобно и хорошо, но самое сложное — локализовать проблему по багрепорту от живого пользователя. Иногда это бывает сложно. Несмотря на все преимущества Python, модуля «телепатии» не существует, и разработчик остаётся один на один со словами пользователя «ничего не работает.

11».

Проект Sentry позволяет сохранять каждую ошибку пользователя с текстом исключения, полным стектрейсом исключения и значениями всех локальных переменных в каждой из функций стектрейса, а так же много другой информации: окружение пользователя (браузер, ОС), все заголовки запроса и вообще всё, что пожелает разработчик.

Одинаковые ошибки группируются, таким образом можно наблюдать за «пульсом» проекта и чинить в первую очередь самые критичные места. Ещё один пример использования sentry — логгирование. Можно просто добавить в спорное место запись в лог сообщения с любыми интересующими разработчика переменными, и всё это окажется в sentry.

Но самый большой плюс в том, что всё это можно (и нужно!) использовать в продакшене.

PuDB

Ещё один интересный отладчик: PuDB представляет собой консольный дебагер с графическим интерфейсом:

Не буду много о нём писать (честно говоря, я сам активно им не пользовался), предлагаю прочитать короткую заметка на хабре: Удобный отладчик для Python/Django проектов от пользователя int22h или более полный обзор: Отладка Python/Django при помощи PuDB.

Winpdb

Standalone отладчик Python, на этот раз с полноценным графическим интерфейсом: Winpdb:

Читайте также:
В какой программе сделать чек лист для инстаграм

Его разработчики утверждают, что winpdb в 20 раз быстрее pdb, а так же поддерживает работу с тредами. Очень большой и подробный туториал можно найти на этой странице: code.google.com/p/winpdb/wiki/DebuggingTutorial.

IDE

Отдельного слова заслуживают универсальные «комбайны» программирования: IDE, которые позволяют не выходя из редактора запустить код, отпрофилировать его или запустить встроенный отладчик. Я, пожалуй, выделю несколько продуктов, предназначенных для разработки на Python: PyCharm, PyDev, Wing IDE и PTVS.

Лирическое отступление

К сожалению, лично я сколько не пытался, так и не смог пересилить себя и променять скорость, удивительную гибкость и удобство работы с консолью и любимым текстовым редактором (будь то vim, emacs или sublime text) на любую из вышеперечисленных IDE, однако мои коллеги успешно ими пользуются и поэтому я советую хотя бы дать этим замечательным продуктам шанс и попробовать их.

Если честно, я не вижу особого смысла рассматривать каждую из этих IDE, достаточно знать что они есть, что они успешно справляются со своими задачами и вы можете использовать встроенный отладчик прямо из редактора, — это действительно удобно, круто и здорово.

Спасибо всем, кто дочитал и прокомментировал.

Владимир Рудных,
Технический руководитель Календаря Mail.Ru.

Источник: habr.com

Как использовать отладчик pdb для Python приложений

Как использовать отладчик pdb

pdb — это встроенный отладчик для Python, который, в отличие от print() , позволяет отлаживать программу в процессе её работы.

Отладка Python-кода с помощью print

Как уже говорилось ранее, кто-то используют print() для отображения информации, которая помогает понять, что происходит в коде. Кто-то использует логи для тех же целей, но давайте не путать использование логов на продакшене и случаи, когда их используют во время поиска багов в коде и после удаляют.

Но самая большая проблема в использовании print() — это необходимость вносить изменения в код и перезапускать приложение, чтобы увидеть изменения. Давайте разберёмся, почему отладчики эффективнее.

Команды Python-отладчика

Главная задача отладчика — предоставить возможность заглянуть в процесс выполнения кода. Так, например, можно просмотреть стек вызовов, узнать значения переменных, установить брейкпоинты или запустить выполнение кода построчно. Можно провести аналогию с тем, как автомеханик заглядывает под капот автомобиля и начинает перебирать деталь за деталью, пока не найдет причину поломки.

Если вы работаете с Python, то можете не только просматривать код во время отладки, но даже запускать код из командной строки или изменять значения переменных на лету.

Программист АСУТП АО «Гринатом» , Новосибирск , От 60 000 до 80 000 ₽

Python есть встроенный отладчик под названием pdb. Это простая консольная утилита, которая обладает основной функциональностью для отладки кода. Но если вы ищете что-то более продвинутое, то стоит обратить внимание на ipdb – отладчик с функциональностью из IPython.

Проще всего вызвать отладчик pdb из кода, где вы работаете:

import pdb; pdb.set_trace()

Как только интерпретатор доберётся до этой строчки, запустится отладчик и в консоли будут доступны новые команды.

list()

Эта команда покажет часть кода, на выполнении которой сейчас находится интерпретатор. Можно передать два аргумента first и last для просмотра определённого участка кода. Если указать только first, то будет выведен код вокруг искомой строки.

up(p) и down(d)

Эти команды используются для передвижения по стеку вызовов. С их помощью можно отследить, откуда была вызвана текущая функция.

step() и next()

Другая пара не менее важных команд. С их помощью можно выполнять код построчно. Единственное различие между ними в том, что next() перейдёт к следующей строке вне зависимости от вызываемых функций, а step() перейдёт в вызванную функцию, если это возможно.

break()

Эта команда позволяет создавать брейкпоинты без внесений изменений в код. Ниже разберём этот этап более детально.

Краткий список команд отладчика pdb:

  • args() — выводит аргументы функции;
  • continue() или (cont) — продолжит выполнение до первого брейкпоинта или до завершения программы;
  • help() — выводит список доступных команд или подсказки по определённой команде;
  • jump() — перепрыгивает к выполнению указанной строчки кода;
  • list() — выводит исходный код программы вокруг выбранной строки;
  • expression() — выводит значение выражения;
  • pp — выводит значение в «красивом» виде;
  • quit или exit() — отменяет выполнение программы;
  • return() — завершает выполнение текущей функции.

Продолжаем изучать Python-отладчик

Рассмотренный ранее способ работы с отладчиком требовал внесения изменения в код для вывода чего-нибудь или установки брейкпоинта. Но часто при работе с внешними библиотеками появляется необходимость в их отладке. Конечно, можно открыть исходный код библиотеки и вызвать pdb .

Но теперь есть возможность запускать приложение напрямую из отладчика без внесения изменения в код. Для этого воспользуемся следующей командой:

$ python3 -m pdb

Давайте разберём на примере. Есть простое приложение, которое отслеживает рабочее время. Для её работы используется библиотека requests , отвечающая за выполнение HTTP-запросов. Попробуем прервать выполнение во время запроса.

Как это сделать? Запустим приложение через отладчик и установим брейкпоинт внутри библиотеки requests .

$ python3 -m pdb run.py > /Users/. /run.py(1)() -> from TimeLog.app import run_app (Pdb) b requests/sessions.py:555 Breakpoint 1 at /. /lib/python3.6/site-packages/requests/sessions.py:555 (Pdb) c

Как можно заметить, не нужно указывать полный путь до библиотеки. Можно указать относительную ссылку от sys.path . Таким же образом можно отлаживать и ваше приложение.

Теперь куда проще отлаживать код. Не надо вносить изменения в приложение или во внешние библиотеки.

Но что делать, если в приложении происходит много вызовов, а вам надо обработать только какой-то определённый? Можно точно указать условие, при выполнении которого отладчик будет прерывать выполнение приложения.

В данном примере прерывание произойдёт только в случае, если json будет иметь в себе ключ time_entry .

$ python3 -m pdb run.py > /Users/. /run.py(1)() -> from TimeLog.app import run_app (Pdb) b requests/sessions.py:555, json is not None and ‘time_entry’ in json Breakpoint 1 at /Users/. /lib/python3.6/site-packages/requests/sessions.py:555 (Pdb) c

Отладка кода Django

Если вы используете Django, то скорее всего знаете, что, если в настройках значение параметра DEBUG установлено как True , то для каждого исключения будет выводиться отдельная страница с указанием типа исключения, стек вызовов, локальные переменные и т.д.

Если вы хотите прокачать отладчик, то установите django-extensions и используйте команду runserver_plus для запуска сервера. Также можно указать пароль для доступа к отладке следующей командой:

WERKZEUG_DEBUG_PIN=1234 ./manage.py runserver_plus

Прим. перев. В Werkzeug, начиная с версии 0.11, появилась возможность доступа по паролю к отладчику. Это сделано для повышения безопасности при попытках несанкционированного доступа.

Если вы используете django-extensions, то получите страницу со всеми вызовами, кодом и окном отладчика.

Процесс отладки осуществляется с помощью WSGI библиотеки Werkzeug.

Существует множество способов отладки приложений, но специализированные инструменты могут дать вам огромное преимущество по сравнению с другими разработчиками и помогут сэкономить время и силы при поиске багов. Cреды разработки предлагают широкий выбор средств отладки, подробнее о них в нашей подборке лучших IDE и редакторов кода для Python.

Источник: tproger.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru