July 7, 2021

Капризы отладки в Jupyter

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

Освещение темы будем строить на базе тех приемов отладки, о которых я рассказывал ранее, в частности модуля pdb. Во-первых, в ноутбуке отладка работает внутри любого блока стека вызовов, кроме его вершины:

Дальше вы будете блуждать по служебному коду, так и не добравшись до вызываемого блока. Может помочь обертывание кода в блок if либо функцию:

Другой магией является вызов интерактивного режима и выход из него. Как я указывал ранее, интерактивный режим нужен для выполнения произвольной команды в месте остановки дебаггера. Вход осуществляется посредством ввода команды interact, а выход - исполнения управляющей команды End of Transmission (EOT), которая соответствует нажатию Ctrl+D. Однако, так как Jupyter работает в браузере, горячая комбинация не поможет (предназначена для добавления закладки), и приходится искать другие пути исполнения команды:

Ниже представляю пути решения:

  • записать символ с кодом EOT (\x04) в буфер обмена и, скопировав оттуда, ввести в ячейку:
from pandas.io.clipboard import copy; copy("\x04")
  • записать символ в файл и проделать то же:
with open('debug_symb.txt','w') as f_w:
    f_w.write('\x04')
  • вывести символ с помощью print (или так !echo '\x04'):
print("\x04")

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

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