Zum Inhalt springen

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.

Wer die REPL regelmäßig nutzt und ihre wichtigsten Funktionen kennt, kann sich beim Entwickeln viele kleine Umwege sparen. Seit Python 3.13 ist auch die eingebaute Shell deutlich komfortabler geworden.

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 verwendest Du stattdessen möglicherweise python3 oder py.

Anschließend kannst Du Python-Code direkt eingeben:

>>> 6 * 7
42
>>> name = "Karl"
>>> print(f"Willkommen, {name}!")
Willkommen, Karl!

Jede vollständige Eingabe wird sofort ausgeführt. Dadurch erhältst Du direkt Feedback, ohne eine Datei speichern und starten zu müssen.

Die neue REPL seit Python 3.13

Bis einschließlich Python 3.12 war die eingebaute REPL vergleichsweise spartanisch. Python 3.13 führte eine neue, in Python geschriebene Shell ein, die auf PyREPL basiert.

Sie wird standardmäßig verwendet, wenn Python in einem unterstützten interaktiven Terminal gestartet wird.

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 bearbeiten. Bei der alten REPL musste häufig jede Zeile einzeln wiederhergestellt werden.

Das ist besonders bei Funktionen, Schleifen und längeren Bedingungen hilfreich.

Farben für Prompts und Tracebacks

Prompts und Tracebacks werden standardmäßig farbig dargestellt, sofern das verwendete Terminal Farben unterstützt.

Dadurch lassen sich Fehlermeldungen und die entscheidenden Stellen eines Tracebacks schneller erkennen.

Direkte REPL-Kommandos

Die Kommandos help, exit und quit funktionieren in der neuen REPL auch ohne Klammern:

>>> help
>>> exit

Die bisherigen Schreibweisen bleiben ebenfalls gültig:

>>> help()
>>> exit()

Die Funktionstasten F1 bis F3

Die neue REPL bringt drei praktische Funktionen mit:

Taste Funktion
F1 Öffnet die interaktive Python-Hilfe
F2 Öffnet eine übersichtliche 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 die erzeugten Outputs werden ausgeblendet. Dadurch kannst Du frühere Eingaben einfacher finden und erneut verwenden.

Der Paste-Mode über F3 erleichtert das Einfügen größerer Code-Blöcke. Ein weiterer Druck auf F3 beendet ihn wieder.

Je nach Terminal oder Belegung der Funktionstasten können diese Shortcuts anders reagieren oder vom Terminal selbst abgefangen werden.

Weitere Verbesserungen in Python 3.14

Python 3.14 erweitert die neue REPL um zwei sichtbare Funktionen.

Syntax-Highlighting während der Eingabe

Python-Code wird bereits beim Tippen farblich hervorgehoben. Strings, Zahlen, Keywords und andere Bestandteile des Codes lassen sich dadurch leichter voneinander unterscheiden.

Das Syntax-Highlighting funktioniert, wenn das Terminal ANSI-Farben unterstützt und die Farbausgabe nicht deaktiviert wurde.

Autovervollständigung für Imports

Python 3.14 kann Module und Submodule beim Schreiben von Imports vervollständigen.

Gib beispielsweise Folgendes ein und drücke anschließend Tab:

import co

Die REPL kann nun passende Module vorschlagen, deren Name mit co beginnt.

Das funktioniert auch bei Submodulen:

from concurrent import i

Die Autovervollständigung schlägt hier passende Submodule von concurrent vor. Attribute eines bereits importierten Moduls werden von dieser neuen Import-Autovervollständigung allerdings noch nicht vollständig abgedeckt.

Auf die alte REPL zurückschalten

Falls die neue Shell in einem älteren oder ungewöhnlich konfigurierten Terminal Probleme verursacht, kannst Du sie über die Umgebungsvariable PYTHON_BASIC_REPL deaktivieren.

Unter Linux und macOS startest Du Python beispielsweise so:

PYTHON_BASIC_REPL=1 python

In der PowerShell kannst Du die Variable folgendermaßen setzen:

$env:PYTHON_BASIC_REPL = "1"
python

Python verwendet dann wieder die einfachere, traditionelle REPL.

Normalerweise ist das nicht notwendig. Die Option ist hauptsächlich zur Fehlersuche und für Terminals gedacht, in denen PyREPL nicht wie erwartet funktioniert.

Eingebaute Tricks, die Du kennen solltest

Auch ohne zusätzliche Tools bietet die Python-REPL einige Funktionen, die beim Erkunden von Code sehr hilfreich sind.

Das letzte Ergebnis mit _ weiterverwenden

Der Unterstrich _ enthält in der REPL automatisch das zuletzt ausgegebene Ergebnis:

>>> 6 * 7
42
>>> _ + 1
43
>>> _ * 2
86

Das ist praktisch, wenn Du mit einem Ergebnis direkt weiterrechnen möchtest, ohne es vorher einer eigenen Variablen zuzuweisen.

Für längere oder wichtige Berechnungen solltest Du dennoch einen sprechenden Variablennamen verwenden:

schaden = 6 * 7

Objekte mit dir(...) erkunden

Die Funktion dir(...) zeigt Dir die Namen der Attribute und Methoden eines Objekts oder Datentyps:

>>> dir(str)
['__add__', '__class__', ..., 'split', 'startswith', 'strip', ...]

Möchtest Du beispielsweise wissen, welche Methoden Strings besitzen, ist dir(str) ein guter Ausgangspunkt.

Die Liste kann zunächst überwältigend wirken. Namen, die mit zwei Unterstrichen beginnen und enden, sind spezielle Methoden. Für den Einstieg kannst Du Dich auf Namen wie split, strip, lower oder startswith konzentrieren.

Hilfe mit help(...) anzeigen

Mit help(...) öffnest Du die eingebaute Dokumentation zu einem Objekt:

>>> help(str.strip)

Python zeigt Dir anschließend, wie die Methode verwendet wird und was sie zurückgibt.

dir(...) und help(...) ergänzen sich gut:

  1. Mit dir(...) findest Du verfügbare Methoden.
  2. Mit help(...) liest Du nach, wie eine bestimmte Methode funktioniert.
  3. Anschließend probierst Du sie direkt in der REPL aus.

Beispielsweise:

>>> text = "  Dungeon  "
>>> text.strip()
'Dungeon'

So kannst Du eine unbekannte API erkunden, ohne die REPL verlassen zu müssen.

Den Typ eines Wertes prüfen

Auch type(...) gehört zu den wichtigsten Werkzeugen beim interaktiven Arbeiten:

>>> type(100)
<class 'int'>
>>> type("100")
<class 'str'>
>>> type(3.5)
<class 'float'>

Gerade bei Inputs oder Rückgabewerten von Funktionen hilft ein kurzer Blick auf den Datentyp häufig dabei, Fehler schnell zu verstehen.

IPython: Die Komfort-Shell

Die eingebaute REPL ist für kurze Experimente inzwischen sehr gut geeignet. Für umfangreicheres exploratives Arbeiten bietet IPython jedoch weiterhin zusätzliche Funktionen.

Du installierst IPython in Deiner Python-Umgebung mit:

python -m pip install ipython

Anschließend startest Du es mit:

ipython

IPython verwendet nummerierte Inputs und Outputs:

In [1]: zahlen = [1, 2, 3, 4]

In [2]: sum(zahlen)
Out[2]: 10

Die Nummern helfen dabei, frühere Ergebnisse wiederzufinden und später erneut zu referenzieren.

Hilfe mit ? und ??

Ein Fragezeichen hinter einem Objekt zeigt Informationen wie Signatur und Docstring an:

In [3]: sum?

Zwei Fragezeichen versuchen zusätzlich, den Quellcode anzuzeigen:

In [4]: sum??

Der Quellcode kann nur angezeigt werden, wenn er für das betreffende Objekt verfügbar ist. Bei manchen eingebauten oder in C implementierten Funktionen ist das nicht möglich.

Magic-Commands

IPython besitzt besondere Kommandos, die Magics genannt werden. Line-Magics beginnen mit %, Cell-Magics mit %%.

Einige besonders nützliche Beispiele:

In [5]: %timeit sum(range(1000))
8.1 µs ± 120 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

In [6]: %run dungeon.py

In [7]: %history

In [8]: %edit

Die tatsächlich ausgegebenen Laufzeiten hängen vom Rechner, der Python-Version und der aktuellen Systemlast ab.

Wichtige Magics sind unter anderem:

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

Mit einem Fragezeichen kannst Du auch die Dokumentation zu einer Magic anzeigen:

In [9]: %timeit?

Automatisches Reloading von Modulen

Beim Entwickeln an eigenen Modulen ist die autoreload-Extension besonders praktisch:

In [10]: %load_ext autoreload

In [11]: %autoreload 2

IPython versucht anschließend, importierte Module vor der Ausführung des nächsten Inputs automatisch neu zu laden.

Dadurch kannst Du eine Python-Datei in Deinem Editor verändern und die neuen Änderungen anschließend in IPython testen, ohne die Shell nach jeder Änderung neu zu starten.

autoreload ist sehr praktisch, kann bei komplexen Modulen aber Grenzen haben. Ein vollständiger Neustart der Shell bleibt deshalb manchmal die zuverlässigste Möglichkeit, einen sauberen State herzustellen.

Shell-Kommandos ausführen

Mit einem Ausrufezeichen kannst Du einen Befehl an die Shell weiterreichen:

In [12]: !python --version
Python 3.14.6

Unter Linux und macOS könntest Du beispielsweise den Inhalt des aktuellen Verzeichnisses anzeigen:

In [13]: !ls

Unter Windows lautet der entsprechende Befehl meist:

In [13]: !dir

Diese Shell-Kommandos sind kein normaler Python-Code. Sie funktionieren nur in IPython und vergleichbaren Umgebungen.

ptpython: Eine REPL mit Editor-Gefühl

ptpython legt seinen Schwerpunkt stärker auf die 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

Anschließend startest Du die Shell mit:

ptpython

Beim Tippen zeigt ptpython mögliche Vervollständigungen direkt an. Mehrzeilige Inputs lassen sich ähnlich wie in einem kleinen Editor bearbeiten.

Besonders interessant ist ptpython für Dich, wenn Du:

  • regelmäßig längere Code-Blöcke in der REPL schreibst,
  • viel Wert auf Autocompletion legst,
  • Vi- oder Emacs-Keybindings bevorzugst,
  • das Verhalten und Aussehen Deiner REPL konfigurieren möchtest.

IPython und ptpython kombinieren

ptpython kann auch als Frontend für IPython verwendet werden. Dadurch erhältst Du die Magic-Commands und weiteren Funktionen von IPython zusammen mit dem Editing und der Autocompletion von ptpython.

Dafür müssen beide Pakete installiert sein:

python -m pip install ipython ptpython

Anschließend startest Du die kombinierte Shell mit:

ptipython

Ob diese Kombination für Dich einen echten Vorteil bietet, hängt stark von Deinem Workflow ab. Für viele Aufgaben reicht entweder IPython oder ptpython allein vollkommen aus.

Welche REPL solltest Du verwenden?

REPL Geeignet für
Eingebaute REPL schnelle Tests ohne zusätzliche Installation
IPython Exploration, Benchmarks, Module und umfangreichere Sessions
ptpython komfortables Editing, Autocompletion und eigene Keybindings
ptipython Kombination aus IPython-Features und ptpython-Frontend

Für den Einstieg in Python reicht die eingebaute REPL vollständig aus. Besonders mit Python 3.13 oder neuer bietet sie bereits die wichtigsten Komfortfunktionen.

IPython lohnt sich, sobald Du häufiger interaktiv arbeitest, Laufzeiten messen oder eigene Module während der Entwicklung untersuchen möchtest.

ptpython ist vor allem dann interessant, wenn Dir das Editieren innerhalb der Shell besonders wichtig ist.

Du musst Dich auch nicht dauerhaft auf eine Variante festlegen. Alle greifen letztlich auf Python zurück und können je nach Aufgabe nebeneinander verwendet werden.

Stolperfallen

  • _ in einem Skript verwenden: Das automatische Speichern des letzten Outputs in _ ist eine Funktion der REPL. In einem normalen Skript ist _ lediglich ein gewöhnlicher Variablenname.

  • REPL-Prompts in ein Skript kopieren: >>>, ..., In [1]: und Out[1]: gehören zur jeweiligen Shell und nicht in eine Python-Datei.

  • IPython-Magics in normalem Python verwenden: %timeit, %run und andere Magics sind keine gültige Python-Syntax. Sie funktionieren nur in IPython oder einer kompatiblen Umgebung.

  • Shell-Kommandos mit Python-Code verwechseln: Eine Eingabe wie !ls wird von IPython an die System-Shell weitergegeben. Sie ist nicht Bestandteil der Programmiersprache Python.

  • Den State einer langen Session vergessen: Variablen, Imports und andere Änderungen bleiben innerhalb einer laufenden REPL erhalten. Dadurch kann Code funktionieren, obwohl ein benötigter Schritt schon viel früher ausgeführt wurde. Bei unklaren Ergebnissen hilft häufig ein Neustart mit sauberem State.

  • autoreload blind vertrauen: Nicht jede Änderung an einem Modul lässt sich in einer laufenden Session zuverlässig nachladen. Besonders bei komplexen Klassen oder importierten Objekten kann ein Neustart notwendig sein.

Fazit

Die eingebaute Python-REPL ist längst mehr als ein einfacher Taschenrechner. Seit Python 3.13 bietet sie Multiline-Editing, History-Browser, Paste-Mode und farbige Tracebacks. Python 3.14 ergänzt Syntax-Highlighting sowie Autovervollständigung für Imports.

Für kurze Tests und zum Lernen reicht diese REPL in den meisten Fällen aus.

IPython erweitert sie um Magics, komfortable Hilfe, Benchmarks, Shell-Integration und einen besser nachvollziehbaren Input- und Output-Verlauf. ptpython konzentriert sich dagegen stärker auf Editing, Autocompletion und konfigurierbare Bedienung.

Welche Shell am besten passt, entscheidet deshalb weniger der Funktionsumfang als Dein persönlicher Workflow.

Weiterlesen

0 Kommentare

Noch keine Kommentare. Sei der/die Erste!