Die im wissenschaftlichen Bereich beliebte IDE JupyterLab besticht durch die Integration von Python-Quellcode mit formatierten Texten, Diagrammen, Tabellen und weiteren Elementen.
Das Projekt Jupyter [1] bietet Open-Source-Werkzeuge für die interaktive Arbeit mit vielen verschiedenen Programmiersprachen, darunter auch mit Python. JupyterLab [2], die aktuellste Version der Nutzerschnittstelle, passt wohl am ehesten in die Kategorie der integrierten Entwicklungsumgebungen (Integrated Development Environment, IDE). Die Anwendungsgebiete fallen aber anders aus als bei traditionellen IDEs wie Visual Studio oder Eclipse.
Geschichtliches zu JupyterLab
Python bietet schon immer eine sogenannte REPL, also einen Read-Eval-Print-Loop, gern auch interaktiver Prompt genannt. Es nimmt an diesem Prompt Anweisungen und Ausdrücke entgegen und antwortet mit den Rückgabewerten. Selbst vollständige Programme lassen sich am Prompt schreiben, wenn auch nicht sehr komfortabel. IPython [4], eine stark verbesserte REPL für Python, läuft auf der Kommandozeile und lässt sich damit auch via SSH oder über andere Terminalzugänge nutzen. Mit IPython Notebook erfolgte der Umzug in den Webbrowser, und die Nutzung von Notebooks kam hinzu. Die nächste Version, Jupyter Notebook, verbesserte die Nutzererfahrung erheblich. Die aktuelle, weiter optimierte und neu implementierte Version heißt JupyterLab.
Notebooks im Browser
JupyterLab läuft vollständig im Webbrowser. Bei lokaler Nutzung startet das Kommando »jupyter lab« einen Server auf »localhost«. Das Schwesterprojekt JupyterHub [3] bietet zusätzlich eine HTTPS-gesicherte Internet-Verbindung und Mehrbenutzerbetrieb. Der sogenannte Kernel fungiert als Server, der Browser dient als Client. Bei der Nutzung mit Python dient IPython als Kernel. Zur Begrüßung erscheint der Launcher (Abbildung 1), in dem sich unterschiedliche Objekte erstellen lassen – in den meisten Fällen Notebooks als zentrales Element.
Die Notebooks erlauben in Zellen die Eingabe von Python-Quelltext. Jede Zelle kann einzelne Zeilen oder vollständige Python-Programme enthalten und lässt sich per Tastendruck ([Umschalt]+[Eingabe]) ausführen. Abbildung 2 zeigt ein sehr einfaches Beispiel-Notebook. Neben einer Syntaxhervorhebung bieten die Zellen typische Funktionen wie Tab-Vervollständigung, automatisches Einrücken nach einem Doppelpunkt und das Übersetzen von Tabulatoren in vier Leerzeichen.
Markdown
Neben Codezellen können Notebooks auch Zellen in Markdown-Notation enthalten. Mit dieser einfachen und weitverbreiteten Markup-Sprache lassen sich dem Notebook formatierte Texte hinzufügen. Abbildung 3 zeigt den Markdown-Quelltext, der beim Ausführen der Zelle zu dem in Abbildung 2 gezeigten Text führt. Da es sich bei HTML um eine Untermenge von Markdown handelt, können Sie bei Bedarf auch HTML nutzen. Weiterhin unterstützt ein Notebook die LaTeX-Formatierung für mathematische Formeln; Abbildung 4 zeigt ein einfaches Beispiel.
Magische Funktionen
Ein wichtiger Aspekt von JupyterLab sind die von IPython bereitgestellten Magic Functions. Dazu gehören Werkzeuge zum Ausführen typischer Shell-Kommandos, zum Speichern und Laden von Dateien, für das Profiling von Python-Code sowie zum Umschalten von Zellen auf andere Sprachen wie Bash oder PyPy.
Abbildung 5 zeigt Line-Magics für das Auflisten der Dateien im aktuellen Arbeitsverzeichnis (»%ls«) und die Zeitmessung von Python-Ausdrücken (»%timeit«) sowie eine Cell-Magic für das Umstellen einer Zelle auf HTML-Inhalt (»%%html«). Ein einzelnes Prozentzeichen leitet Einzeiler ein, deren Argumente direkt in der Zeile stehen. Die Variante mit zwei Prozentzeichen ändert das Verhalten der gesamten Zelle und erlaubt beliebig viele Zeilen.
Mit »%quickref« zeigt IPython in JuyterLab eine kompakte Hilfe an, inklusive einer Liste aller magischen Funktionen. Oft machen magische Funktionen Notebooks unabhängig vom Betriebssystem. So übersetzt IPython »%ls« auf Unix-Systemen in »ls« und unter Windows in »dir«. Gibt es keine passende Magic Function für eine bestimmte Aufgabe, erlaubt das Ausrufezeichen das Weiterleiten an die aktuelle Shell. Mit Bash wäre das dann beispielsweise »!ls«, mit der Windows-Cmd-Konsole »!dir«. In diesem Fall fällt freilich die Unabhängigkeit vom Betriebssystem weg.
Die Tabelle “Beispiele für magische Funktionen” gibt einen Überblick über einige typische Magic Functions. Viele Python-Bibliotheken stellen über IPython-Erweiterungen eigene magische Funktionen bereit. Die Funktion »%load_ext« lädt eine solche IPython-Extension; danach stehen die neuen magischen Funktionen der Bibliothek zur Verfügung.
|
Funktionen |
Bedeutung |
|
»%cd« |
aktuelles Arbeitsverzeichnis wechseln |
|
»%env« |
Umgebungsvariablen anzeigen oder setzen |
|
»%less« |
Datei mit einem Pager wie »less« anzeigen |
|
»%load« |
Quelltext aus Datei in Zelle laden |
|
»%load_ext« |
IPython-Erweiterung (mit magischen Funktionen) laden |
|
»%ls« |
Alias für »!ls -F -G« (Unix) und »dir« (Windows) |
|
»%mkdir« |
neues Verzeichnis erstellen |
|
»%mv« |
Datei oder Verzeichnis verschieben |
|
»%rm« |
Datei löschen |
|
»%rmdir« |
Verzeichnis löschen |
|
»%run« |
Programm in aktueller Zelle ausführen |
|
»%save« |
Zellinhalte in Datei speichern |
|
»%tb« |
letzten Traceback ausgeben |
|
»%timeit« |
Laufzeit für Anweisungen (»%%timeit«) oder Ausdrücke (»%timeit«) messen |
|
»%xmode« |
Detailgrad für Ausnahmemeldungen ändern |
Eine detaillierte und mit Beispielen versehene Hilfe zu Python-Objekten und magischen Funktionen zeigt JupyterLab nach Eingabe eines Fragezeichens an. Probieren Sie das zum Beispiel mit »?%timeit« aus, erläutert JupyterLab auch die Kommandozeilenargumente, die es erlauben, das Verhalten der magischen Funktion anzupassen. So führt »%timeit« in der Vorgabe einen Ausdruck sieben Mal aus, was sich aber mit dem Schalter »-r« ändern lässt.
Erweiterungen
Das schon von Haus aus sehr leistungsfähige JupyterLab bietet viele Möglichkeiten, den Funktionsumfang mittels Addons zu vergrößern. Diese Erweiterungen können recht einfach ausfallen und zum Beispiel schlicht einen weiteren Dateityp zum Launcher-Menü hinzufügen.
Es gibt aber auch komplexere Erweiterungen. So integriert »jupyterlab-lsp« das Language Server Protocol (LSP) in die IDE. Damit erhält JupyterLab eine wesentlich umfangreichere Tab-Vervollständigung sowie Helfer, die mit orangefarbenen und roten Unterstreichungen auf Verbesserungsmöglichkeiten beziehungsweise Fehler im Code hinweisen.
Damit wird JupyterLab zu einer passablen IDE, die zum Beispiel den Sprung zu Funktionsdefinitionen, das Anzeigen aller Referenzen eines Objekts oder das automatische Umbenennen von Variablennamen per rechtem Mausklick ermöglicht.
Mehr als Code und Text
Neben farblich dargestelltem Code und Markdown-formatiertem Text beherrscht JupyterLab noch andere grafische Ausgaben. Das in der letzten Zeile einer Zelle zurückgegebene Objekt zeigt JupyterLab mit der speziellen Methode »__repr__« an. Das entspricht dem Verhalten des interaktiven Prompts »>>>«. Besitzt ein Objekt eine Methode »_repr_html_«, nutzt JupyterLab diese statt »__repr__«.
Die sehr beliebte Bibliothek Pandas [5] nutzt diese Möglichkeit ausgiebig. Abbildung 6 zeigt, wie JupyterLab einen Pandas-»DataFrame« darstellt. Mit »df.head()« zeigt Pandas nur die ersten fünf Zeilen an. Insgesamt enthält der »DataFrame«, also die Tabelle, über 38 000 Zeilen. Es gibt Erweiterungen, die diese Darstellung ändern, indem sie bestimmte Zahlen in anderen Farben ausgeben, das Sortieren der Spalten per Mausklick ermöglichen oder das Editieren der Inhalte von Tabellenzellen erlauben.
Tabellen sind gut, Diagramme aber oft besser. Erfreulicherweise beherrscht JupyterLab das direkte Anzeigen von Grafiken. Abbildung 7 zeigt ein Diagramm für die Tabelle aus Abbildung 6. Im Hintergrund nutzt Pandas für den Plot die Bibliothek Matplotlib. Statt die Daten für den gesamten Zeitraum darzustellen, wählt »df[df.index.year > 2001]« nur die Jahre ab 2002 aus. Der Nutzer kann den interaktiven Plot zoomen, den Darstellungsausschnitt verschieben und das Bild per Mausklick speichern.

Abbildung 7: Ein Diagramm zum »DataFrame« aus Abbildung 6.
Nicht nur Python
Dieser Artikel zeigt, wie JupyterLab mit Python arbeitet. Jupyter unterstützt aber mehr als 40 weitere Programmiersprachen. Dazu gehören zum Beispiel C, Elixier, Fortran, Go, Julia, R und Scala. Es gibt viele weitere Kernels. Auf Github listet das Projekt Jupyter über 150 davon auf [6]. Nach der Installation eines entsprechenden Kernels zeigt der Launcher ein Start-Icon für die neue Sprache. Andere Kernels bieten nicht immer die gesamte hier vorgestellte Funktionalität. So gibt es bei Kerneln in anderen Sprachen keine magischen Funktionen, denn die stellt IPython zur Verfügung. Trotzdem bietet das interaktive Arbeiten in JupyterLab eine ideale Möglichkeit, um eine neue Programmiersprache auszuprobieren.
Nicht für alle Aufgaben
JupyterLab ist ein tolles Werkzeug, eignet sich allerdings nicht für jede Aufgabe gleich gut. Aus der Verbindung der interaktiven Arbeitsweise mit den Möglichkeiten eines Editors und dem Client-Server-Konzept ergeben sich ein paar Besonderheiten.
So sollten Sie im Hinterkopf behalten, dass sich Zellen immer wieder ausführen lassen. Daher muss die durch die Nummerierung der Zellen repräsentierte Ausführungsreihenfolge nicht unbedingt mit der Anzeigereihenfolge übereinstimmen. Ein weiteres Problem können globale Variablen darstellen, die Sie in einer Zelle definiert haben, wenn Sie demselben Namen später mehrfach neue Werte zuweisen.
Eventuell gibt es die Zelle mit der aktuellen Variablendefinition nicht mehr, weil Sie sie gelöscht haben. Der Name der Variablen existiert aber noch mit diesem Wert. Dann sehen Sie eventuell »x = 10«, während in Wirklichkeit aus der Zuweisung einer nicht mehr existierenden Zelle »x = 100« resultiert. Diese “unsichtbaren” Variablenzuweisungen können den Nutzer gehörig durcheinanderbringen, wie der Autor aus leidiger Erfahrung weiß.
Faustregeln
Es gibt aber ein paar Regeln, die diesen Problemen entgegenwirken. Lassen Sie Notebooks nicht zu groß werden, und legen Sie zu jedem neuen Thema lieber ein neues Notebook an. Bei Ungereimtheiten starten Sie am besten einfach den Kernel neu. Damit verschwinden “unsichtbare” Variablenzuweisungen. Lagern Sie Funktionen und Klassen frühzeitig in Module aus und importieren Sie diese. Die magische Funktion »%autoreload« leistet dabei gute Dienste und synchronisiert alle importierten Funktionen und Klassen immer mit den aktuellsten Modulinhalten.
Notebooks eignen sich besonders gut für die interaktive Arbeit, das Ausprobieren von Konzepten, das Erzeugen von Berichten mit Berechnungen, Tabellen und Grafiken sowie das Lernen und Lehren. Weniger gut eignet sich JupyterLab für das Entwickeln von Bibliotheken und Desktop-GUI-Anwendungen sowie für die Arbeit mit Frameworks wie Django.
In jedem Fall lässt sich JupyterLab gut mit anderen Werkzeugen kombinieren. So entwickeln Sie eine Bibliothek idealerweise in einer traditionellen IDE, greifen für die Dokumentation, manuelle Tests, Diagramme und andere Elemente aber durchaus gewinnbringend auf JupyterLab zurück.
Nbdev
Einen interessanter Ansatz, um JupyterLab auch für die Entwicklung von Bibliotheken zu nutzen, bietet Nbdev [7]. Durch die automatische Synchronisierung von Notebooks und Modulen sowie die Integration von Dokumentation und Test in ein Notebook entsteht eine Umgebung für das literale Programmieren. Hilfen für typische Aufgaben wie die Integration von Versionsverwaltungssystemen, Continuous Integration (CI) und das Erzeugen von Pip-Paketen runden Nbdev ab. Dieser interessante Ansatz hat das Potenzial, die Nachteile von JupyterLab für die Entwicklung von Bibliotheken mehr als auszugleichen. (jcb/jlu)
Der Autor
Dr.-Ing. Mike Müller, Geschäftsführer der Python Academy [8] und erfahrener Python-Trainer, hat die Sprache 1999 für sich entdeckt und nutzt Jupyter seit vielen Jahren. Er ist erster Vorstandsvorsitzender des Python Software Verband e.V., war Chairman der EuroPython 2014 und hat auch die EuroSciPy 2008 und 2009 sowie die PyCon DE 2011 und 2012 geleitet.
Infos
- Jupyter: https://jupyter.org
- JupyterLab: https://jupyterlab.readthedocs.io/en/stable/getting_started/overview.html
- JupyterHub: https://jupyter.org/hub
- IPython: https://ipython.org
- Pandas: https://pandas.pydata.org
- Kernels: https://github.com/jupyter/jupyter/wiki/Jupyter-kernels
- Nbdev: https://nbdev.fast.ai
- Python Academy: https://python-academy.de












