python

Визуальный отладчик для Jupyter

  • четверг, 7 мая 2020 г. в 00:28:37
https://habr.com/ru/company/ruvds/blog/500422/
  • Блог компании RUVDS.com
  • Разработка веб-сайтов
  • Python


Прогресс большинства программных проектов строится на малых изменениях, которые, перед тем, как двигаться дальше, тщательно оценивают. Быстрое получение результатов выполнения кода и высокая скорость итеративной разработки — это одни из основных причин успеха Jupyter. В особенности — в сфере научных исследований.

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


Окружение JupyterLab

Проект Jupyter уже несколько лет прилагает усилия к тому, чтобы закрыть разрыв между блокнотами и обычными IDE. Эти усилия, в значительной мере, представлены платформой JupyterLab, которая даёт разработчику более совершенный и удобный интерфейс, в который входят менеджер файлов, текстовые редакторы, консоли, блокноты.

Правда, до недавнего времени в JupyterLab кое-чего не хватало. Речь идёт о том, что являло собой главную причину, по которой пользователи вынуждены были переключаться на другие среды. Пользователям Jupyter не хватало визуального отладчика. Пользователи, особенно те из них, которые привыкли к обычным IDE, долго просили об этой возможности.

Отладчик для Jupyter


Сегодня, после нескольких месяцев разработки, мы рады представить вашему вниманию первый публичный релиз визуального отладчика для Jupyter!

Это — лишь первый релиз, но отладчик уже позволяет устанавливать в ячейках блокнотов и в файлах с исходным кодом точки останова. Он позволяет исследовать содержимое переменных, просматривать стек вызовов. И этим его возможности не ограничиваются.


Визуальный отладчик Jupyter в действии

Испытание отладчика на сайте проекта binder



Проект binder

Попробовать новый отладчик в деле можно на сайте проекта binder. Вот демонстрационный блокнот, с которым вы можете поэкспериментировать.

Установка


Фронтенд отладчика можно установить в виде расширения JupyterLab:

jupyter labextension install @jupyterlab/debugger

В будущих релизах фронтенд отладчика будет включён в состав JupyterLab по умолчанию.

На бэкенде, для обеспечения работы отладчика, должно присутствовать ядро, в котором реализован Jupyter Debug Protocol (подробнее о нём мы поговорим ниже). Пока единственное ядро, в котором реализован данный протокол, это — xeus-python. Оно представляет собой Jupyter-ядро для языка программирования Python. (В планах развития проекта есть и поддержка протокола отладчика в ipykernel.)

Установить ядро xeus-python можно так:

conda install xeus-python -c conda-forge

После того, как xeus-python и расширение отладчика установлены, всё должно быть готово к работе с визуальным отладчиком Jupyter.

Обратите внимание на то, что существуют и PyPI-«колёса» для xeus-python, но ни всё ещё носят статус экспериментальных, а их доступность зависит от платформы.

Подробности о Jupyter Debug Protocol


▍Новые типы сообщений для каналов Control и IOPub


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

Существуют несколько коммуникационных каналов:

  • Канал Shell, который работает по схеме запрос/ответ и используется, например, для запросов на выполнение кода.
  • Канал IOPub, который представляет собой односторонний канал связи, идущий от ядра к клиенту. Он используется, например, для перенаправления стандартных потоков вывода (stdout и stderr).
  • Канал Control, похожий на канал Shell, но работающий на другом сокете. Благодаря этому его сообщения не ставятся в очередь вместе запросами на выполнение кода и имеют более высокий приоритет. Канал Control уже использовался для запросов Interrupt и Shutdown. Мы решили, что будем использовать его и для команд, отправляемых отладчику.

В протокол добавлены два новых типа сообщений:

  • Сообщения debug_[request/reply], которые используются для запроса выполнения отладчиком некоего действия. Например — это добавление в код точки останова или пошаговое выполнение кода. Такие сообщения отправляются в канал Control.
  • Односторонние сообщения debug_event, которые используются отладочным ядром для отправки сведений о событиях отладки фронтенду. Такие сообщения отправляются через канал IOPub.

▍Расширение Debug Adapter Protocol


Ключевой принцип архитектуры Jupyter — это отсутствие привязки к некоему языку программирования. Поэтому важно, чтобы протокол отладчика поддерживал бы адаптацию к различным реализациям ядер.

Популярным стандартом в сфере отладки является протокол Debug Adapter Protocol (DAP), разработанный Microsoft. Это — протокол, основанный на JSON, который, например, лежит в основе подсистемы отладки Visual Studio Code. Этот протокол поддерживает множество бэкендов, рассчитанных на различные языки.

В результате для нас было совершенно естественным использование DAP-сообщений посредством недавно добавленных сообщений debug_[request/reply] и debug_event.

Правда, в случае с Jupyter этого оказалось не вполне достаточно:

  • Для поддержки перезагрузки страницы, или для случаев, когда клиент подключается в процессе работы, ядра Jupyter должны хранить состояние отладчика (точки останова, сведения о том, остановлен ли в данный момент отладчик). Фронтенд может запрашивать это состояние с помощью сообщения debug_request.
  • Для поддержки отладки кода, находящегося в ячейках блокнота, и для поддержки консолей Jupyter, которые не основаны на файлах с исходным кодом, нам, кроме того, нужны были сообщения, позволяющие отправлять отладчику код, в который могут быть добавлены точки останова.

Содержание запросов к отладчику и его ответов, помимо этих двух отличий, соответствует DAP.

Все эти расширения протокола ядра Jupyter были предложены в качестве кандидатов на включение в официальную спецификацию. Соответствующее предложение по развитию Jupyter (Jupyter Enhancement Proposal, JEP) можно найти здесь.

Xeus-python — первое ядро Jupyter, поддерживающее отладку


Xeus — это С++-реализация протокола ядра Jupyter. Это, само по себе, не ядро. Это — библиотека, которая помогает разрабатывать ядра. Эта библиотека полезна при разработке ядер для языков, которые имеют C- или C++-API (вроде Python, Lua или SQL). Она берёт на себя решение трудоёмких задач по реализации протокола обмена сообщениями Jupyter. Это позволяет автору ядра сосредоточиться на задачах, связанных с интерпретацией языковых конструкций: на выполнении кода, на его анализе и так далее.

С использованием xeus было разработано несколько ядер, включая популярное ядро xeus-cling для C++, основанное на C++-интерпретаторе cling, созданном в CERN. Ядро xeus-python — это альтернатива ipykernel, основанная на xeus. Вот материал о первом релизе ядра xeus-python.

Ядро xeus-python подошло для первой реализации протокола отладчика по нескольким причинам:

  • Оно поддерживает конкурентное выполнение кода, что позволяет выполнять работу с каналом Control в отдельном потоке.
  • Оно отличается компактной кодовой базой. Благодаря этому данное ядро является хорошей «песочницей», в которой удобно реализовывать что-то новое. Реализация первой версии протокола отладчика в ipykernel потребовала бы более серьёзного рефакторинга и больших усилий по согласованию изменений на ранних стадиях разработки.

▍План развития ядра xeus-python


Среди краткосрочных целей развития xeus-python можно отметить следующие:

  • Добавление поддержки возможностей IPython. Сейчас это, в сравнении с ipykernel, является основной отсутствующей возможностью xeus-python.
  • Улучшение PyPI-«колёс» xeus-python.

▍О других ядрах


То, что уже сделано в плане поддержки отладки во фронтенде, может быть использовано с любыми ядрами, реализующими расширенный протокол ядра.

В этом году мы будем работать над тем, чтобы обеспечить поддержку отладки в как можно большем количестве ядер.

Скоро поддержка отладки появится для других ядер, основанных на xeus, имеющих много общего с ядром xeus-python. Например, для таких, как xeus-cling.

Подробности об архитектуре фронтенда отладчика


Расширение отладчика для JupyterLab даёт пользователям механизмы, наличия которых обычно ожидают от IDE:

  • Боковая панель с окнами, реализующими следующие возможности: наблюдение за переменными, просмотр точек останова, просмотр кода, анализ стека вызовов.
  • Возможность устанавливать точки останова прямо в коде, в частности — в коде, находящемся в ячейках блокнота и в консолях.
  • Визуальные маркеры, указывающие позицию, в которой остановилось выполнение кода.

При работе с блокнотами Jupyter сведения о состоянии выполнения кода хранятся в ядре. Но код ячейки может быть выполнен, после чего эта ячейка может быть удалена из блокнота. Что должно произойти в том случае, если пользователю, в ходе отладки, захочется войти в удалённый блок кода?

Расширение поддерживает этот специфический сценарий и умеет выводить код ранее выполненной ячейки в режиме только для чтения.


Переход в код, находящийся в удалённой ячейке

Отлаживать можно и код, находящийся в консолях и в файлах.


Отладка кода из консоли в JupyterLab


Отладка в JupyterLab кода, находящегося в файле

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


Одновременная отладка нескольких блокнотов

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


Средства для исследования переменных

Расширение отладчика для JupyterLab было спроектировано так, чтобы оно могло бы работать с любым ядром, которое поддерживает отладку.

Благодаря тому, что расширение полагается на протокол DAP, оно абстрагирует особенности различных языков и даёт пользователю единообразный интерфейс отладки.

На следующей диаграмме показан поток сообщений, передаваемых в ходе сессии отладки между пользователем, расширением JupyterLab и ядром.


Использование Debug Adapter Protocol в отладчике (источник)

Планы на будущее


В 2020 году мы планируем серьёзно улучшить отладчик. А именно, речь идёт о следующем:

  • Поддержка вывода различных MIME-типов в окне исследования переменных.
  • Поддержка работы с условными точками останова в интерфейсе отладчика.
  • Повышение удобства работы с интерфейсом отладчика.
  • Реализация возможности отладки Voilà-приложений из расширения @jupyter-voila/jupyterlab-preview.

Уважаемые читатели! А вы уже пробовали визуальный отладчик Jupyter?