Капризы отладки в 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 является непечатаемым, он может быть не заметен в выводе. В этом случае копируйте всю область вывода (или файла) в буфер обмена (чтобы заведомо его выделить), а затем вставляйте в ячейку для последующего исполнения.