обзор
July 8, 2021

Советы отладки в Jupyter от мученика

Чтобы сильно облегчить себе жизнь при программировании на сервере с Jupyter, запомните эти рекомендации по отладке. Рассмотрим несколько кейсов:

  1. пошаговое исполнение программы, состоящей из набора py файлов
  2. отладка участка с произвольной точки останова в блокноте
  3. пошаговое исполнение отдельной функции

Отладка программы

В первом случае удобно запустить сценарий на Python в отдельном блокноте. При этом установить точку останова можно как посредством запуска сценария с флагом -d, так и поставив set_trace в нужном месте.

%run -d имя.py

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

b номер_строки
c

Первая команда устанавливает в строчке точку останова, а вторая продолжает исполнение до нее.

Альтернативным способом является разметка исследуемых участков программы строками вида:

import pdb;pdb.set_trace()

и обычный запуск:

%run имя.py 

Отладка участка в блокноте

В соответствии с особенностями работы отладчика со стеком вызовов потребуется заключить код в блок if или функцию и перед исследуемой строкой набрать

import pdb;pdb.set_trace()

а затем запустить ячейку на исполнение

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

def set_trace():
    import pdb;import sys
    pdb.set_trace(sys._getframe().f_back)
if True:
    # str_i
    set_trace()
    # str_j

Отладка функции

Для этого можно воспользоваться следующей функцией:

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

и вызов производить как в примере ниже:

def test_func(a,e=1):
    b = 3
    d = b-e
    c = a+b
    
debug(test_func, a=5)

При работе с отладчиком вам могут пригодится часто используемые команды:

b - поставить точку останова

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

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

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

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

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

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

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

l - показать текущую и окружающие строки

w - распечатать стек вызовов

r - выход из функции

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