cat posts/repl-power-ipython-ptpython.md
REPL-Power: Mehr aus der interaktiven Shell holen
Die neue REPL seit Python 3.13, praktische eingebaute Funktionen sowie die Alternativen IPython und ptpython – die interaktive Shell kann weit mehr als nur rechnen.
In Teil 1 der Python-Serie haben wir die REPL hauptsächlich als Taschenrechner verwendet. Damit verkaufen wir sie allerdings deutlich unter Wert.
Die interaktive Shell eignet sich hervorragend, um Code auszuprobieren, Datentypen und APIs zu erkunden, kleine Fehler nachzustellen oder eine Idee zu testen, ohne dafür jedes Mal ein Skript anzulegen.
Seit Python 3.13 ist auch die eingebaute REPL deutlich komfortabler geworden. Mehrzeiliges Editing, History-Browser und Paste-Mode machen für viele kurze Experimente zusätzliche Tools überflüssig. Wer noch mehr möchte, kann weiterhin zu IPython oder ptpython greifen.
Was ist eine REPL?
Die Abkürzung REPL steht für:
- Read: Eingabe lesen
- Evaluate: Eingabe auswerten
- Print: Ergebnis ausgeben
- Loop: auf die nächste Eingabe warten
Du startest die eingebaute REPL, indem Du Python ohne den Namen eines Skripts aufrufst:
python
Je nach Betriebssystem und Installation verwendest Du stattdessen möglicherweise
python3 oder py.
Danach kannst Du Python-Code direkt eingeben:
>>> 6 * 7
42
>>> name = "Karl"
>>> print(f"Willkommen, {name}!")
Willkommen, Karl!
Sobald eine Eingabe vollständig ist, führt Python sie aus und zeigt Dir direkt das Ergebnis. Datei anlegen, speichern und erneut starten entfällt.
Gerade beim Ausprobieren einer unbekannten Funktion oder beim Nachstellen eines kleinen Fehlers ist das oft schneller als ein separates Testskript.
Die neue REPL seit Python 3.13
Bis einschließlich Python 3.12 war die eingebaute CPython-REPL vergleichsweise spartanisch. Python 3.13 führte eine neue, in Python geschriebene Shell ein, die auf PyREPL basiert. PyREPL stammt ursprünglich aus dem PyPy-Projekt.
Sie wird standardmäßig verwendet, wenn Python in einem unterstützten interaktiven Terminal läuft.
Mehrzeiliges Editing
Mehrzeilige Code-Blöcke werden als zusammengehörige Eingabe behandelt:
>>> for zahl in range(3):
... print(f"Runde {zahl}")
...
Runde 0
Runde 1
Runde 2
Holst Du diesen Code später mit der Pfeiltaste nach oben aus der History zurück, kannst Du den gesamten Block wieder bearbeiten. Das ist besonders bei Funktionen, Schleifen und längeren Bedingungen angenehm.
Die alte REPL war an dieser Stelle deutlich unbequemer und behandelte mehrzeilige Eingaben wesentlich stärker als einzelne Zeilen.
Farben für Prompts und Tracebacks
Prompts und Tracebacks werden standardmäßig farbig dargestellt, sofern das Terminal Farben unterstützt.
Bei längeren Fehlermeldungen lässt sich dadurch schneller erkennen, wo der eigentliche Exception-Typ steht und welche Stellen zum Traceback gehören.
Die Farbausgabe kann unter anderem über PYTHON_COLORS oder die verbreitete
Umgebungsvariable NO_COLOR beeinflusst werden.
Direkte REPL-Kommandos
Kommandos wie help, exit und quit funktionieren in der neuen REPL auch
ohne Klammern:
>>> help
>>> exit
Die bisherigen Schreibweisen bleiben ebenfalls gültig:
>>> help()
>>> exit()
Das klingt nach einer Kleinigkeit, fühlt sich in einer interaktiven Shell aber wesentlich natürlicher an.
Die Funktionstasten F1 bis F3
PyREPL bringt drei nützliche Shortcuts mit:
| Taste | Funktion |
|---|---|
F1 |
Öffnet die interaktive Python-Hilfe |
F2 |
Zeigt die History ohne Prompts und Outputs |
F3 |
Aktiviert oder beendet den Paste-Mode |
Der History-Browser über F2 zeigt nur den zuvor eingegebenen Code. Die Prompts
>>> und ... sowie erzeugte Ausgaben werden ausgeblendet. Dadurch kannst Du
beispielsweise einen früheren Code-Block sauber kopieren, ohne ihn anschließend
von REPL-Ausgaben befreien zu müssen.
F3 schaltet in einen speziellen Paste-Mode. Das ist vor allem bei Terminals
nützlich, die Bracketed Paste nicht selbst unterstützen. Größere Code-Blöcke
lassen sich dort einfügen, ohne dass jede Zeile sofort ausgeführt oder durch die
automatische Einrückung verändert wird.
Mit einem weiteren Druck auf F3 verlässt Du den Modus wieder.
Je nach Terminal, Desktop-Umgebung oder Belegung der Funktionstasten können diese Shortcuts vom Terminal selbst abgefangen werden.
Weitere Verbesserungen in Python 3.14
Python 3.14 baut die neue REPL weiter aus. Zwei Änderungen fallen beim Arbeiten direkt auf.
Syntax-Highlighting während der Eingabe
Python-Code wird bereits beim Tippen farblich hervorgehoben. Strings, Zahlen, Keywords und andere Bestandteile des Codes sind dadurch leichter voneinander zu unterscheiden.
Das Highlighting ist standardmäßig aktiviert, solange die neue REPL verwendet und die Farbausgabe nicht deaktiviert wurde.
Autovervollständigung für Imports
Python 3.14 kann Module und Submodule direkt beim Schreiben eines Imports vervollständigen.
Gib beispielsweise Folgendes ein und drücke anschließend Tab:
import co
Die REPL kann nun installierte Module vorschlagen, deren Name mit co beginnt.
Das funktioniert auch bei Submodulen:
from concurrent import i
Hier kann die REPL passende Submodule von concurrent anbieten.
Wichtig ist die Einschränkung: Diese Erweiterung betrifft Module und Submodule. Die Attribute eines bereits importierten Moduls werden von dieser Import-Autocompletion nicht vervollständigt.
Auf die alte REPL zurückschalten
Falls PyREPL in einem ungewöhnlich konfigurierten Terminal Probleme verursacht
oder Du auf ein Verhalten der alten REPL angewiesen bist, kannst Du sie über die
Umgebungsvariable PYTHON_BASIC_REPL deaktivieren.
Unter Linux und macOS beispielsweise:
PYTHON_BASIC_REPL=1 python
In der PowerShell:
$env:PYTHON_BASIC_REPL = "1"
python
Python verwendet dann wieder die einfachere klassische REPL.
Für den normalen Alltag ist das kaum nötig. Die Option ist hauptsächlich als Fallback für inkompatible Terminals und bestehende Workflows gedacht, die etwa von einer älteren Readline-Konfiguration abhängen.
Eingebaute Tricks, die Du kennen solltest
Auch ohne IPython oder andere zusätzliche Pakete besitzt die Python-REPL einige Funktionen, mit denen sich unbekannter Code erstaunlich gut erkunden lässt.
Das letzte Ergebnis mit _ weiterverwenden
Der Unterstrich _ enthält in der normalen Python-REPL automatisch das Ergebnis
des zuletzt ausgegebenen Ausdrucks:
>>> 6 * 7
42
>>> _ + 1
43
>>> _ * 2
86
Das ist praktisch, wenn Du mit einem Ergebnis direkt weiterrechnen möchtest, ohne dafür erst eine Variable anzulegen.
Python behandelt _ dabei allerdings etwas speziell. Du solltest der Variable
in der REPL nicht selbst einen Wert zuweisen:
>>> _ = 10
Damit würdest Du die eingebaute Bedeutung von _ mit einer eigenen Variable
überdecken.
Für Werte, mit denen Du länger arbeiten möchtest, ist ohnehin ein sprechender Name die bessere Wahl:
schaden = 6 * 7
Objekte mit dir(...) erkunden
dir(...) liefert Dir einen Überblick über die Attribute und Methoden eines
Objekts oder Datentyps:
>>> dir(str)
['__add__', '__class__', ..., 'split', 'startswith', 'strip', ...]
Möchtest Du wissen, was Du mit einem String machen kannst, ist dir(str) ein
guter Ausgangspunkt.
Die Liste wirkt zunächst etwas wild. Namen, die mit zwei Unterstrichen beginnen
und enden, gehören meist zum Python-Datenmodell. Für den Einstieg interessieren
eher Einträge wie split, strip, lower oder startswith.
dir(...) ist dabei als praktische Erkundungshilfe gedacht und nicht als
garantiert vollständige Beschreibung einer API.
Hilfe mit help(...) anzeigen
Hast Du mit dir(...) eine interessante Methode gefunden, kannst Du direkt die
eingebaute Hilfe öffnen:
>>> help(str.strip)
Python zeigt Dir die Signatur und Dokumentation der Methode an.
Ein typischer kleiner REPL-Workflow sieht deshalb so aus:
>>> text = " Dungeon "
>>> dir(text)
['__add__', ..., 'split', 'startswith', 'strip', ...]
>>> help(text.strip)
>>> text.strip()
'Dungeon'
Du findest eine Methode, liest kurz nach, was sie tut, und probierst sie direkt aus. Dafür musst Du weder die REPL verlassen noch ein Testskript anlegen.
Den Typ eines Wertes prüfen
Auch type(...) gehört zu den nützlichsten Werkzeugen beim interaktiven
Arbeiten:
>>> type(100)
<class 'int'>
>>> type("100")
<class 'str'>
>>> type(3.5)
<class 'float'>
Gerade bei Benutzereingaben, Rückgabewerten oder Daten aus einer fremden API klärt ein kurzer Blick auf den Typ häufig schon, warum sich ein Wert anders verhält als erwartet.
IPython: Mehr Werkzeug für längere Sessions
Die eingebaute REPL reicht für kurze Experimente inzwischen erstaunlich weit. Wenn Du regelmäßig interaktiv arbeitest, bietet IPython aber weiterhin Funktionen, die weit darüber hinausgehen.
Du installierst IPython in Deiner Python-Umgebung mit:
python -m pip install ipython
Anschließend startest Du es mit:
ipython
IPython nummeriert Inputs und Outputs:
In [1]: zahlen = [1, 2, 3, 4]
In [2]: sum(zahlen)
Out[2]: 10
Das macht längere Sessions nachvollziehbarer und ermöglicht es außerdem, auf frühere Ein- und Ausgaben zurückzugreifen.
Hilfe mit ? und ??
Ein Fragezeichen hinter einem Objekt zeigt Informationen wie Signatur und Docstring an:
In [3]: sum?
Mit zwei Fragezeichen versucht IPython zusätzlich, den Quellcode des Objekts anzuzeigen:
In [4]: sum??
Das funktioniert naturgemäß nicht immer. Bei eingebauten oder in C implementierten Funktionen steht der Python-Quellcode häufig nicht zur Verfügung.
Für eigene Funktionen oder viele Python-Bibliotheken ist ?? dagegen eine
schnelle Möglichkeit, direkt nachzusehen, was hinter einem Aufruf steckt.
Magic-Commands
Eine der bekanntesten Besonderheiten von IPython sind die Magics.
Line-Magics beginnen mit %, Cell-Magics mit %%.
Einige Beispiele:
In [5]: %timeit sum(range(1000))
In [6]: %run dungeon.py
In [7]: %history
In [8]: %edit
%timeit führt einen Ausdruck mehrfach aus und ermittelt daraus eine
aussagekräftigere Laufzeit als eine einzelne Messung mit der Stoppuhr.
Weitere nützliche Magics sind:
| Magic | Zweck |
|---|---|
%timeit |
Misst wiederholt die Laufzeit eines Ausdrucks |
%run |
Führt ein Python-Skript aus |
%history oder %hist |
Zeigt frühere Inputs an |
%edit |
Öffnet Code in einem Editor |
%load |
Lädt Code in den aktuellen Input |
%lsmagic |
Zeigt die verfügbaren Magics an |
%debug |
Startet nach einer Exception den Debugger |
Mit einem Fragezeichen bekommst Du auch Hilfe zu einer Magic:
In [9]: %timeit?
Nach einer Exception direkt debuggen
Eine besonders praktische Funktion geht zwischen den bekannteren Magics leicht
unter: %debug.
Angenommen, ein Aufruf schlägt fehl:
In [10]: int("Dungeon")
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[10], line 1
----> 1 int("Dungeon")
ValueError: invalid literal for int() with base 10: 'Dungeon'
Danach kannst Du direkt Folgendes eingeben:
In [11]: %debug
IPython startet den Python-Debugger am Ort der Exception. Dort kannst Du Variablen untersuchen, den Stack entlanggehen und Dir den Zustand des Programms ansehen.
Bei Fehlern in eigenen Funktionen ist das oft wesentlich hilfreicher, als
zusätzliche print()-Aufrufe in den Code einzubauen.
Automatisches Reloading von Modulen
Wenn Du parallel in einem Editor an einem eigenen Modul arbeitest, ist die
autoreload-Extension praktisch:
In [12]: %load_ext autoreload
In [13]: %autoreload 2
Mit %autoreload 2 versucht IPython, importierte Module vor der nächsten
Code-Ausführung automatisch neu zu laden.
Du kannst also beispielsweise dungeon.py im Editor verändern und anschließend
in derselben IPython-Session weiterarbeiten, ohne nach jeder Änderung die Shell
neu zu starten.
Das funktioniert erstaunlich gut, hat aber Grenzen. Änderungen an Klassen, Properties oder C-Extensions können sich nicht immer sauber in eine bereits laufende Session übertragen. Wenn sich ein Objekt plötzlich anders verhält als erwartet, ist ein kompletter Neustart weiterhin die zuverlässigste Methode für einen sauberen State.
Shell-Kommandos ausführen
Mit einem Ausrufezeichen kannst Du Befehle an die System-Shell weiterreichen:
In [14]: !python --version
Python 3.14.7
Unter Linux und macOS kannst Du beispielsweise den Inhalt des aktuellen Verzeichnisses anzeigen:
In [15]: !ls
Unter Windows:
In [15]: !dir
Diese Eingaben sind kein Python-Code. Das ! ist IPython-Syntax und weist
IPython an, den Rest der Zeile an die System-Shell weiterzugeben.
Das Ergebnis lässt sich sogar einer Variable zuweisen:
In [16]: dateien = !ls
In [17]: dateien
Out[17]: [...]
Damit verschwimmt die Grenze zwischen Python-Session und Shell ein Stück weit, was bei kleinen Entwicklungs- und Analyseaufgaben ziemlich praktisch sein kann.
ptpython: Eine REPL mit Editor-Gefühl
ptpython legt den Schwerpunkt stärker auf Eingabe und Bearbeitung von Code.
Es basiert auf prompt_toolkit und bietet unter anderem:
- Syntax-Highlighting
- Autocompletion
- komfortables Multiline-Editing
- eine durchsuchbare History
- verschiedene Farbschemas
- Mausunterstützung
- Vi- und Emacs-Keybindings
- Bracketed Paste in unterstützten Terminals
Du installierst ptpython mit:
python -m pip install ptpython
Danach startest Du die Shell mit:
ptpython
Beim Tippen zeigt ptpython mögliche Vervollständigungen direkt an. Mehrzeilige Inputs lassen sich eher wie in einem kleinen Editor bearbeiten als in einer klassischen Shell.
Interessant ist ptpython vor allem, wenn Du viel direkt in der REPL schreibst, starke Autocompletion möchtest oder mit Vi- beziehungsweise Emacs-Keybindings arbeitest.
Wer nur gelegentlich einen Ausdruck ausprobiert, braucht diesen zusätzlichen Komfort dagegen kaum.
IPython und ptpython kombinieren
ptpython kann auch als Frontend für IPython verwendet werden. Dadurch bekommst Du die Magics und weiteren Funktionen von IPython zusammen mit der Oberfläche von ptpython.
Dafür installierst Du beide Pakete:
python -m pip install ipython ptpython
Anschließend startest Du:
ptipython
Damit erhältst Du im Wesentlichen IPython mit dem Editing und der Autocompletion von ptpython.
Ob sich die Kombination lohnt, hängt vom eigenen Workflow ab. Für die meisten Aufgaben reicht IPython oder ptpython allein.
Welche REPL solltest Du verwenden?
| REPL | Geeignet für |
|---|---|
| Eingebaute REPL | schnelle Tests ohne zusätzliche Installation |
| IPython | Exploration, Debugging, Benchmarks und längere Sessions |
| ptpython | komfortables Editing, Autocompletion und eigene Keybindings |
| ptipython | IPython-Funktionen mit ptpython-Frontend |
Für den Einstieg und kurze Tests ist die eingebaute REPL die naheliegende Wahl. Seit Python 3.13 fehlen ihr viele Komfortfunktionen nicht mehr, für die früher schnell eine alternative Shell installiert wurde.
IPython lohnt sich, wenn Du länger interaktiv arbeitest, Code untersuchst, Benchmarks ausführst oder direkt aus einer Session heraus debuggen möchtest.
ptpython richtet sich eher an Leute, denen das Editieren und Navigieren innerhalb der Shell besonders wichtig ist.
Du musst Dich dabei nicht auf eine einzige Variante festlegen. Auf meinem Rechner kann die normale REPL genauso ihren Platz haben wie IPython für längere Sessions.
Stolperfallen
-
_selbst überschreiben: In der normalen REPL verweist_auf das letzte ausgegebene Ergebnis. Eine eigene Zuweisung an_überdeckt dieses Verhalten. -
REPL-Prompts in ein Skript kopieren:
>>>,...,In [1]:undOut[1]:gehören zur jeweiligen Shell und nicht in eine Python-Datei. -
IPython-Magics in normalem Python verwenden:
%timeit,%run,%debugund andere Magics sind keine normale Python-Syntax. Sie funktionieren nur in IPython oder einer kompatiblen Umgebung. -
Shell-Kommandos mit Python-Code verwechseln: Eine Eingabe wie
!lswird von IPython an die System-Shell weitergegeben. Auch das ist keine Python-Syntax. -
Den State einer langen Session vergessen: Variablen, Imports und andere Änderungen bleiben in einer laufenden REPL erhalten. Dadurch kann Code funktionieren, obwohl ein dafür notwendiger Schritt schon vor einer Stunde ausgeführt wurde. Wenn das Verhalten nicht mehr nachvollziehbar ist, hilft ein Neustart mit sauberem State.
-
autoreloadblind vertrauen: Nicht jede Änderung an einem Modul lässt sich zuverlässig in eine laufende Session übertragen. Bei merkwürdigen Effekten ist ein Neustart häufig schneller als die Fehlersuche im alten State.
0 Kommentare
Noch keine Kommentare. Sei der/die Erste!
Anmelden um einen Kommentar zu hinterlassen.