Visual Debugger für Jupyter

Der Fortschritt der meisten Softwareprojekte basiert auf kleinen Änderungen, die vor dem Fortfahren sorgfältig ausgewertet werden. Schnelle Ergebnisse der Codeausführung und eine hohe Geschwindigkeit der iterativen Entwicklung sind einige der Hauptgründe für den Erfolg von Jupyter. Besonders im Bereich der wissenschaftlichen Forschung.

Jupyter-Benutzer experimentieren gerne mit Notizbüchern und verwenden Notizbücher als interaktives Kommunikationsmittel. Wenn wir jedoch über die Aufgaben der klassischen Softwareentwicklung sprechen, beispielsweise die Umgestaltung einer großen Codebasis, können wir sagen, dass Jupyter zur Lösung solcher Probleme häufig durch reguläre IDEs ersetzt wird.


Die JupyterLab-Umgebung Das Jupyter-

Projekt arbeitet seit mehreren Jahren daran, die Lücke zwischen Notebooks und regulären IDEs zu schließen. Diese Bemühungen werden größtenteils durch die JupyterLab-Plattform repräsentiert, die dem Entwickler eine erweiterte und bequeme Oberfläche bietet, die einen Dateimanager, Texteditoren, Konsolen und Notizblöcke umfasst.

Es stimmt, bis vor kurzem fehlte etwas in JupyterLab. Dies ist der Hauptgrund, warum Benutzer gezwungen waren, in andere Umgebungen zu wechseln. Jupyter-Benutzern fehlte ein visueller Debugger. Benutzer, insbesondere diejenigen, die an normale IDEs gewöhnt sind, haben lange nach dieser Funktion gefragt.

Debugger für Jupyter


Heute, nach einigen Monaten der Entwicklung, freuen wir uns, die erste öffentliche Veröffentlichung des visuellen Debuggers für Jupyter präsentieren zu können!

Dies ist nur die erste Version, aber mit dem Debugger können Sie bereits Haltepunkte in Notebookzellen und in Quelldateien festlegen. Sie können den Inhalt von Variablen untersuchen und den Aufrufstapel anzeigen. Und seine Fähigkeiten sind nicht darauf beschränkt.


Jupyter Visual Debugger in Aktion

Testen des Debuggers auf der Binder-Projektseite



Das Binder-Projekt Sie können

einen neuen Debugger für den Fall auf der Binder-Projekt-Website ausprobieren. Hier ist ein Demo-Notizblock, mit dem Sie experimentieren können.

Installation


Das Frontend des Debuggers kann als JupyterLab-Erweiterung installiert werden:

jupyter labextension install @jupyterlab/debugger

In zukünftigen Versionen wird das Debugger-Frontend standardmäßig in JupyterLab enthalten sein.

Damit der Debugger funktioniert, muss im Backend ein Kernel vorhanden sein, in dem das Jupyter-Debug-Protokoll implementiert ist (mehr dazu weiter unten). Bisher ist xeus-python der einzige Kernel, der dieses Protokoll implementiert . Es ist der Jupyter-Kern für die Programmiersprache Python. (Die Projektentwicklungspläne enthalten auch Unterstützung für das Debugger-Protokoll in ipykernel.)

Sie können den xeus-python-Kernel wie folgt installieren:

conda install xeus-python -c conda-forge

Nachdem xeus-python und die Debugger-Erweiterung installiert wurden, sollte alles bereit sein, um mit dem visuellen Jupyter-Debugger zu arbeiten.

Bitte beachten Sie, dass es auch PyPI-Räder für xeus-python gibt, diese jedoch noch nicht experimentell sind und deren Verfügbarkeit von der Plattform abhängt.

Details zum Jupyter-Debug-Protokoll


▍Neue Nachrichtentypen für Control- und IOPub-Kanäle


Jupyter Kernel (der Teil der Infrastruktur , die ausgeführt wird user code) die Kommunikation mit anderen Teilen des Systems über ein gut ausgebautes Verwendung Interprozess- Kommunikation - Protokoll .

Es gibt mehrere Kommunikationskanäle:

  • Ein Kanal Shell, der gemäß dem Anforderungs- / Antwortschema arbeitet und beispielsweise für Anforderungen zur Codeausführung verwendet wird.
  • Ein Kanal IOPub, bei dem es sich um einen Einweg-Kommunikationskanal handelt, der vom Kern zum Client verläuft. Es wird beispielsweise verwendet, um Standardausgabestreams ( stdoutund stderr) umzuleiten .
  • Ein Kanal Controlähnlich einem Kanal, der Shelljedoch an einem anderen Sockel betrieben wird. Aus diesem Grund werden seine Nachrichten nicht zusammen mit Anforderungen für die Codeausführung in die Warteschlange gestellt und haben eine höhere Priorität. Der Kanal Controlwurde bereits für Abfragen Interruptund verwendet Shutdown. Wir haben beschlossen, es für Befehle zu verwenden, die an den Debugger gesendet werden.

Dem Protokoll wurden zwei neue Nachrichtentypen hinzugefügt:


▍ Debug Adapter Protocol


Das Schlüsselprinzip der Jupyter-Architektur ist das Fehlen einer Bindung an eine bestimmte Programmiersprache. Daher ist es wichtig, dass das Debugger-Protokoll die Anpassung an verschiedene Kernel-Implementierungen unterstützt.

Ein beliebter Debugging-Standard ist das von Microsoft entwickelte Debug Adapter Protocol (DAP). Dies ist ein JSON-basiertes Protokoll, das beispielsweise dem Debugging-Subsystem von Visual Studio Code zugrunde liegt. Dieses Protokoll unterstützt viele Backends, die für verschiedene Sprachen entwickelt wurden.

Infolgedessen war es für uns völlig selbstverständlich, DAP-Nachrichten über kürzlich hinzugefügte Nachrichten debug_[request/reply]und zu verwenden debug_event.

Im Fall von Jupyter war dies jedoch nicht genug:

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

Der Inhalt der Anfragen an den Debugger und seine Antworten entsprechen zusätzlich zu diesen beiden Unterschieden DAP.

Alle diese Erweiterungen des Jupyter-Kernel-Protokolls wurden als Kandidaten für die Aufnahme in die offizielle Spezifikation vorgeschlagen. Ein verwandter Jupyter-Entwicklungsvorschlag (JEPyter Enhancement Proposal, JEP) finden Sie hier .

Xeus-Python ist der erste Jupyter-Kernel, der das Debuggen unterstützt


Xeus ist eine C ++ - Implementierung des Jupyter-Kernel-Protokolls. Dies ist an sich nicht der Kern. Dies ist eine Bibliothek, die bei der Entwicklung von Kerneln hilft. Diese Bibliothek ist nützlich bei der Entwicklung von Kerneln für Sprachen mit einer C- oder C ++ - API (wie Python, Lua oder SQL). Sie kümmert sich um die zeitaufwändigen Aufgaben bei der Implementierung des Jupyter-Messaging-Protokolls. Auf diese Weise kann sich der Autor des Kernels auf Aufgaben konzentrieren, die mit der Interpretation von Sprachkonstrukten zusammenhängen: auf die Codeausführung, auf deren Analyse usw.

Mit xeus wurden mehrere Kerne entwickelt, darunter der beliebte xeus-cling-Kern für C ++, der auf dem in CERN erstellten C ++ - Cling-Interpreter basiert. Der xeus-python- Kernel ist eine auf xeus basierende ipykernel-Alternative. HierMaterial zur ersten Veröffentlichung des Xeus-Python-Kernels.

Der xeus-python-Kernel eignet sich aus mehreren Gründen für die erste Implementierung des Debugger-Protokolls:

  • Es unterstützt die Ausführung von wettbewerbsfähigem Code, sodass Sie die Arbeit mit dem Kanal Controlin einem separaten Thread ausführen können .
  • Es verfügt über eine kompakte Codebasis. Dank dessen ist dieser Kernel eine gute "Sandbox", in der es bequem ist, etwas Neues zu implementieren. Die Implementierung der ersten Version des Debugger-Protokolls in ipykernel würde ein ernsthafteres Refactoring und mehr Aufwand erfordern, um Änderungen in den frühen Entwicklungsstadien zu koordinieren.

▍ Entwicklungsplan für den Xeus-Python-Kernel


Zu den kurzfristigen Entwicklungszielen von xeus-python gehören:

  • Unterstützung für IPython-Funktionen hinzufügen. Im Vergleich zu ipykernel ist dies das wichtigste fehlende Merkmal von xeus-python.
  • Verbesserung der PyPI- "Räder" von Xeus-Python.

▍Über andere Kerne


Was bereits in Bezug auf die Unterstützung des Debuggens im Frontend getan wurde, kann mit allen Kerneln verwendet werden, die das erweiterte Kernelprotokoll implementieren.

In diesem Jahr werden wir daran arbeiten, Debugging-Unterstützung in so vielen Kernen wie möglich bereitzustellen.

Die Debugging-Unterstützung für andere xeus-basierte Kernel, die viel mit dem xeus-Python-Kernel gemeinsam haben, wird in Kürze verfügbar sein. Zum Beispiel für xeus-cling.

Details zur Debugger-Front-End-Architektur


Die Debugger- Erweiterung für JupyterLab bietet Benutzern die Mechanismen, die normalerweise von der IDE erwartet werden:

  • Seitenleiste mit Fenstern, die die folgenden Funktionen implementieren: Überwachen von Variablen, Anzeigen von Haltepunkten, Anzeigen von Code, Analysieren von Anrufstapeln.
  • Die Möglichkeit, Haltepunkte direkt im Code festzulegen, insbesondere im Code in den Notizblockzellen und in den Konsolen.
  • Visuelle Markierungen, die die Position angeben, an der die Codeausführung gestoppt wurde.

Bei der Arbeit mit Jupyter-Notizbüchern werden Informationen zum Status der Codeausführung im Kernel gespeichert. Der Zellencode kann jedoch ausgeführt werden, wonach diese Zelle aus dem Notizbuch gelöscht werden kann. Was soll passieren, wenn der Benutzer während des Debuggens einen Remote-Codeblock eingeben möchte?

Die Erweiterung unterstützt dieses spezielle Szenario und kann den Code einer zuvor ausgeführten Zelle im schreibgeschützten Modus anzeigen.


Wechseln zu dem Code in der Remote-Zelle Sie

können den Code in den Konsolen und in den Dateien debuggen.


Debuggen von Code von der Konsole in JupyterLab


Debuggen in JupyterLab Der Code in der Datei

Debuggen kann auf Notepad-Ebene aktiviert werden, sodass Benutzer den Notepad debuggen und gleichzeitig mit einem anderen Notepad arbeiten können.


Mehrere Notizbücher gleichzeitig

debuggen Variablen können mithilfe einer Baum- oder Tabellenansicht angezeigt werden.


Tools zum Erkunden von Variablen

Die Debugger-Erweiterung für JupyterLab wurde für die Verwendung mit jedem Kernel entwickelt, der das Debuggen unterstützt.

Aufgrund der Tatsache, dass die Erweiterung auf dem DAP-Protokoll basiert, abstrahiert sie die Funktionen verschiedener Sprachen und bietet dem Benutzer eine konsistente Debugging-Oberfläche.

Das folgende Diagramm zeigt den Nachrichtenfluss, der während einer Debugging-Sitzung zwischen dem Benutzer, der JupyterLab-Erweiterung und dem Kernel gesendet wurde.


Verwenden des Debug-Adapterprotokolls in einem Debugger ( Quelle )

Zukunftspläne


Im Jahr 2020 planen wir, den Debugger ernsthaft zu verbessern. Wir sprechen nämlich über Folgendes:

  • Unterstützung für die Ausgabe verschiedener MIME-Typen im Variablen-Explorer-Fenster.
  • Unterstützung für die Arbeit mit bedingten Haltepunkten in der Debugger-Oberfläche.
  • Verbesserung der Benutzerfreundlichkeit der Debugger-Oberfläche.
  • Implementierung der Möglichkeit zum Debuggen von Voilà-Anwendungen über die Erweiterung @jupyter-voila/jupyterlab-preview.

Liebe Leser! Haben Sie den Jupyter Visual Debugger ausprobiert?


All Articles