Отладка на Python: способы и фишки

Отладка – один из важных этапов разработки ПО. Есть много определений этого термина: начиная от “процесса нахождения ошибок на этапе разработки и их устранения”, до “убеждения, что алгоритм исполнения программы соответствует ожиданиям”.

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

def my_function():
    pass

то пройти по нему отладчиком даже необходимо и жизненно важно.

На практике я использую отладку на самых разных уровнях: иногда, нужно найти причину вывода отличного от ожидаемого значения в XLS-отчёт, иногда, зайти на сборку в CI-сервере и найти причину упавшего теста, иногда понять почему отчёт в JS-интерфейсе отличается от значений в базе, а иногда найти причину ошибки в одной из системных библиотек.

Для всего этого есть свои инструменты. В браузере – встроенный отладчик и ключевое слово debugger, в системе – gdb, strace, в Python – свои инструменты. Давайте рассмотрим их.

pdb

pdb – стандартный отладчик для Python 2/3. Самый простой, но в то же время достаточно мощный чтобы справиться с любой задачей отладки.

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

import pdb; pdb.set_trace()

IPython pdb

idpb – расширенный pdb для среды IPython. Поддерживает подсветку синтаксиса и автодополнение. Это, пожалуй, мой основной способ отладки в консоли.

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

import ipdb; ipdb.set_trace()

PyCharm Remote Debug

Удаленная отладка более репрезентативна чем консольный pdb. Часто используя инструмент с более богатым интерфейсом можно разобраться в проблема быстрее.

Изначально remote debugger поставляемый с PyCharm развивался в пределах среды Eclipse PyDev. Поставляемый с PyCharm компонент pydevd – форк, развиваемый командой JetBrains. Спасибо ребятам, они молодцы.

Как настроить удаленную отладку?

  1. Убедиться, что у вас PyCharm Professional Edition :)
  2. Настроить Remote Debugger в PyCharm.
  3. Убедиться что до вас можно достучаться по сети оттуда, где запускается python код. Можно, например, запустить локально netcat-сервер (“netcat -l”), а на хосте с кодом попытаться к этому порту подключиться netcat-клиентом. Если конфигурация сети сложная, всегда можно пробросить порт по SSH.
  4. Установить на сервер pip-пакет pydevd_pycharm.
  5. Добавить вызов отладчика в нужное место в коде.
import pydevd_pycharm
pydevd_pycharm.settrace('172.17.0.1', port=12345)

Когда Python выполнит этот код, произойдет следующее:

  • выполнение программы остановится в этой точке;
  • интерпретатор попытается соединиться с PyCharm, слушающим по адресу 172.17.0.1:12345;
  • при успешном соединении PyCharm отобразит остановленный код.

Ключевой момент: Python-код соединяется с PyCharm-ом, а не наоборот.

VisualStudio Code – PTVSD

Удаленный отладчик VisualStudio Code – PTVSD – гораздо более новый продукт, чем отладчик встроенный в PyCharm. Еще год назад он болел детскими болезнями, наподобие невозможности настроить mapped paths. Однако сейчас, его вполне можно рекомендовать к ежедневному применению. Его большое преимущество перед отладчиком PyCharm – он бесплатен!

Как настроить удаленную отладку?

  1. Настроить удаленную отладку в VisualStudio Code.
  2. Убедиться, что ваш ПК может обратиться к порту, открытом на хосте где запускается код. Как и в случае с PyCharm можно пробросить порт по SSH, но использовать нужно не remote port forwarding метод, а local port forwarding, т.к. соединение произойдет из VSCode в Python.
  3. Установить pip-пакет ptvsd.
  4. Добавить в отлаживаемый участок кода (например, в вызов какой-либо функции) вызов отладчика.
import ptvsd ptvsd.enable_attach(address=('1.2.3.4', 3000))
ptvsd.wait_for_attach()

Ключевой момент: в отличии от PyCharm-отладчика, отладчик PTVSD сам инициирует сетевое соединение, а не ждет подключения к нему.

arm-отладчика, отладчик PTVSD сам инициирует сетевое соединение, а не ждет подключения к нему.

Заключение

Возможностей для отладки в Python более, чем достаточно и все они имеют свои преимущества и недостатки. Я пользуюсь ipdb и PyCharm + PyDevd в зависимости от ситуации.

  • Если мне необходимо отладить код на dev или CI сервере, или нужно отладить код в чужой среде, то я выбираю ipdb, а при его отсутствии pdb. Еще одна причина использовать ipdb – отсутствие автоматической подгрузки дескрипторов.
  •  Если же мне необходимо полноценно видеть картину происходящего, иметь возможностью по-ходить по коду в среде разработки, то я выбираю отладчик PyCharm PyDevd.

Leave a Reply

Your email address will not be published.