Depurador visual para Jupyter

El progreso de la mayoría de los proyectos de software se basa en pequeños cambios que, antes de continuar, se evalúan cuidadosamente. Los resultados rápidos de la ejecución del código y la alta velocidad del desarrollo iterativo son algunas de las principales razones del éxito de Jupyter. Especialmente en el campo de la investigación científica.

A los usuarios de Jupyter les encanta experimentar con las computadoras portátiles; las usan como un medio interactivo de comunicación. Sin embargo, si hablamos de las tareas del desarrollo de software clásico, por ejemplo, refactorizar una base de código grande, entonces podemos decir que para resolver tales problemas, Jupyter a menudo se cambia a IDE regulares.


El entorno JupyterLab El

proyecto Jupyter ha estado trabajando durante varios años para cerrar la brecha entre las computadoras portátiles y los IDE regulares. Estos esfuerzos están representados en gran medida por la plataforma JupyterLab, que brinda al desarrollador una interfaz más avanzada y conveniente, que incluye un administrador de archivos, editores de texto, consolas, blocs de notas.

Es cierto, hasta hace poco, faltaba algo en JupyterLab. Esta es la razón principal por la que los usuarios se vieron obligados a cambiar a otros entornos. Los usuarios de Jupyter carecían de un depurador visual. Los usuarios, especialmente aquellos que están acostumbrados a IDEs regulares, siempre han pedido esta característica.

Depurador para Jupyter


¡Hoy, después de varios meses de desarrollo, nos complace presentar el primer lanzamiento público del depurador visual para Jupyter!

Esta es solo la primera versión, pero el depurador ya le permite establecer puntos de interrupción en las celdas del cuaderno y en los archivos de origen. Le permite examinar el contenido de las variables, ver la pila de llamadas. Y sus capacidades no se limitan a esto.


Jupyter Visual Debugger en acción

Probar el depurador en el sitio del proyecto de carpeta



El proyecto de carpeta Puede

probar un nuevo depurador en el caso en el sitio web del proyecto de carpeta. Aquí hay un bloc de notas de demostración con el que puede experimentar.

Instalación


La interfaz del depurador se puede instalar como una extensión JupyterLab:

jupyter labextension install @jupyterlab/debugger

En futuras versiones, la interfaz del depurador se incluirá en JupyterLab de forma predeterminada.

En el backend, para que el depurador funcione, debe haber un núcleo en el que se implemente el Protocolo de depuración Jupyter (hablaremos más sobre esto a continuación). Hasta ahora, el único núcleo que implementa este protocolo es xeus-python . Es el núcleo de Jupyter para el lenguaje de programación Python. (Los planes de desarrollo del proyecto también incluyen soporte para el protocolo de depuración en ipykernel).

Puede instalar el núcleo xeus-python de esta manera:

conda install xeus-python -c conda-forge

Después de instalar xeus-python y la extensión del depurador, todo debería estar listo para funcionar con el depurador visual Jupyter.

Preste atención al hecho de que también hay "ruedas" de PyPI para xeus-python, pero todavía tienen un estado experimental y su disponibilidad depende de la plataforma.

Detalles del protocolo de depuración de Jupyter


▍Nuevos tipos de mensajes para los canales de control y IOPub


Los núcleos Jupyter (la parte de la infraestructura que ejecuta el código de usuario) se comunican con otras partes del sistema mediante un protocolo de comunicación entre procesos bien desarrollado .

Hay varios canales de comunicación:

  • Un canal Shellque funciona de acuerdo con el esquema de solicitud / respuesta y se utiliza, por ejemplo, para solicitudes de ejecución de código.
  • Un canal IOPub, que es un canal de comunicación unidireccional que se ejecuta desde el núcleo hasta el cliente. Se utiliza, por ejemplo, para redirigir flujos de salida estándar ( stdouty stderr).
  • Un canal Controlsimilar a un canal Shellpero que opera en un zócalo diferente. Debido a esto, sus mensajes no se ponen en cola junto con las solicitudes de ejecución de código y tienen una prioridad más alta. El canal Controlya se ha utilizado para consultas Interrupty Shutdown. Decidimos que lo usaríamos para los comandos enviados al depurador.

Se han agregado dos nuevos tipos de mensajes al protocolo:


▍ Debug Adapter Protocol


El principio clave de la arquitectura Jupyter es la falta de vinculación a un cierto lenguaje de programación. Por lo tanto, es importante que el protocolo del depurador admita la adaptación a diversas implementaciones de kernel.

Un estándar de depuración popular es el Protocolo de adaptador de depuración (DAP), desarrollado por Microsoft. Este es un protocolo basado en JSON que, por ejemplo, subyace al subsistema de depuración de Visual Studio Code. Este protocolo admite muchos backends diseñados para diferentes idiomas.

Como resultado, era completamente natural para nosotros usar mensajes DAP a través de mensajes recientemente agregados debug_[request/reply]y debug_event.

Sin embargo, en el caso de Jupyter esto no fue suficiente:

  • , , , Jupyter ( , , ). debug_request.
  • , , Jupyter, , , , , , .

El contenido de las solicitudes al depurador y sus respuestas, además de estas dos diferencias, corresponde a DAP.

Todas estas extensiones del protocolo del núcleo de Jupyter se han propuesto como candidatos para su inclusión en la especificación oficial. Aquí puede encontrar una propuesta de desarrollo de Jupyter relacionada (JEPyter Enhancement Proposal, JEP) .

Xeus-python es el primer núcleo de Jupyter que admite la depuración


Xeus es una implementación en C ++ del protocolo del núcleo Jupyter. Esto, en sí mismo, no es el núcleo. Esta es una biblioteca que ayuda a desarrollar núcleos. Esta biblioteca es útil para desarrollar núcleos para lenguajes que tienen una API C o C ++ (como Python, Lua o SQL). Ella se encarga de las tareas que llevan mucho tiempo implementar el protocolo de mensajería Jupyter. Esto permite que el autor del núcleo se centre en tareas relacionadas con la interpretación de construcciones de lenguaje: en la ejecución de código, en su análisis, etc.

Se desarrollaron varios núcleos utilizando xeus, incluido el popular núcleo xeus-cling para C ++, basado en el intérprete de C ++ cling creado en CERN. El núcleo xeus-python es una alternativa ipykernel basada en xeus. aquímaterial sobre la primera versión del núcleo xeus-python.

El núcleo xeus-python es adecuado para la primera implementación del protocolo del depurador por varias razones:

  • Admite la ejecución de código competitivo, lo que le permite realizar trabajos con el canal Controlen un hilo separado.
  • Cuenta con una base de código compacta. Gracias a esto, este núcleo es un buen "sandbox" en el que es conveniente implementar algo nuevo. La implementación de la primera versión del protocolo de depuración en ipykernel requeriría una refactorización más seria y un mayor esfuerzo para coordinar los cambios en las primeras etapas de desarrollo.

▍ Plan de desarrollo del núcleo Xeus-python


Entre los objetivos de desarrollo a corto plazo de xeus-python se encuentran los siguientes:

  • Agregar soporte para las características de IPython. Ahora esto, en comparación con ipykernel, es la principal característica que falta de xeus-python.
  • Mejora de PyPI- "ruedas" de xeus-python.

▍Acerca de otros núcleos


Lo que ya se ha hecho en términos de soporte para la depuración en el frontend se puede usar con cualquier kernel que implemente el protocolo de kernel extendido.

Este año trabajaremos para proporcionar soporte de depuración en tantos núcleos como sea posible.

El soporte de depuración llegará pronto para otros núcleos basados ​​en xeus que tienen mucho en común con el núcleo xeus-python. Por ejemplo, para tal como xeus-cling.

Detalles de la arquitectura de front-end del depurador


La extensión del depurador para JupyterLab brinda a los usuarios los mecanismos que generalmente se esperan del IDE:

  • Barra lateral con ventanas que implementan las siguientes características: monitoreo de variables, visualización de puntos de interrupción, visualización de código, análisis de pilas de llamadas.
  • La capacidad de establecer puntos de interrupción directamente en el código, en particular en el código ubicado en las celdas del bloc de notas y en las consolas.
  • Marcadores visuales que indican la posición en la que se detuvo la ejecución del código.

Cuando se trabaja con computadoras portátiles Jupyter, la información sobre el estado de ejecución del código se almacena en el núcleo. Pero el código de la celda se puede ejecutar, después de lo cual esta celda se puede eliminar del cuaderno. ¿Qué debería suceder si el usuario, durante la depuración, desea ingresar un bloque de código remoto?

La extensión admite este escenario específico y puede mostrar el código de una celda ejecutada previamente en modo de solo lectura.


Cambio al código ubicado en la celda remota Puede

depurar el código ubicado en las consolas y en los archivos.


Depuración de código de la consola en JupyterLab


Depuración en JupyterLab el código en el archivo La

depuración se puede habilitar en el nivel del bloc de notas, lo que permitirá a los usuarios depurar el bloc de notas y, al mismo tiempo, trabajar con otro bloc de notas.


Depuración de varios blocs de notas al mismo tiempo

Las variables se pueden ver usando una vista de árbol o tabla.


Herramientas para explorar variables

La extensión del depurador para JupyterLab fue diseñada para funcionar con cualquier núcleo que admita la depuración.

Debido a que la extensión se basa en el protocolo DAP, abstrae las características de varios idiomas y le brinda al usuario una interfaz de depuración consistente.

El siguiente diagrama muestra el flujo de mensajes enviados durante una sesión de depuración entre el usuario, la extensión JupyterLab y el núcleo.


Uso del protocolo de adaptador de depuración en un depurador ( fuente )

Planes futuros


En 2020, planeamos mejorar seriamente el depurador. A saber, estamos hablando de lo siguiente:

  • Soporte para generar varios tipos MIME en la ventana del explorador de variables.
  • Soporte para trabajar con puntos de interrupción condicionales en la interfaz del depurador.
  • Mejora de la usabilidad de la interfaz del depurador.
  • Implementando la capacidad de depurar aplicaciones Voilà desde la extensión @jupyter-voila/jupyterlab-preview.

¡Queridos lectores! ¿Has probado el depurador visual Jupyter?


All Articles