June 20, 2021

Все секреты отладки в Jupyter

Проведем обзор инструментов отладки в Jupyter, которые предназначены для ускорения процесса изменения кода и быстрого поиска ошибок.

Интерактивная отладка

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

def debug(f, *args, **kwargs):
    import pdb
    return pdb.runcall(f, *args, **kwargs)

def set_trace():
    import pdb;import sys
    pdb.set_trace(sys._getframe().f_back)

Теперь протестируем их применение на простенькой функции. Для установки точки останова внесите в произвольную строку ячейки код вызова set_trace:

Для отладки функции достаточно вызвать debug следующим образом:

Команды работы с отладчиком

c - продолжить выполнение кода

n - выполнить строку и перейти к другой

s - переместиться внутрь функции

q - выйти из отладчика

u - перемещение вверх по стеку вызовов

d - перемещение вниз по стеку вызовов

a - вывести аргументы функции

interact - вход в интерактивный режим

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

Если вы захотите исполнить произвольную команду, то следует войти в интерактивный режим посредством исполнения - interact:

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

А вот для выхода из интерактивного режима потребуется использовать трюки. В частности, потребуется передать оболочке сигнал окончания ввода, который имеет код \x04. Проще всего это сделать исполнив:

from pandas.io.clipboard import copy; copy("\x04")

а затем - ctrl+v:

Посмертная отладка

Полезная возможность в любой оболочке, исполняющейся в окружении, имеющем пакет IPython. После исключения набираем %debug и переходим в то место стека вызовов, где оно было возбуждено. Затем посредством u/d можно найти интересующий участок кода и дальше экспериментировать, имея доступ к объектам на момент "падения".

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

Отладка без вмешательства в код

Если вы ограничитесь пошаговым выполнением кода и просмотром значений переменных простых типов, то вам достаточно установить пакет xeus-python.

Так как в Windows менеджер пакетов pip наотрез отказывался устанавливать его, пришлось создать conda окружение и сделать это посредством следующей команды:

conda install -c conda-forge xeus-python

Для применения отладчика потребуется выбрать ядро XPython и протянуть ползунок отладки в положение включения (средняя панель, правый верхний угол):