readline — GNU readline-Schnittstelle¶
Das Modul readline definiert eine Reihe von Funktionen zur Erleichterung der Vervollständigung und des Lesens/Schreibens von Verlaufsdateien aus dem Python-Interpreter. Dieses Modul kann direkt oder über das Modul rlcompleter verwendet werden, das die Vervollständigung von Python-Bezeichnern an der interaktiven Eingabeaufforderung unterstützt. Einstellungen, die mit diesem Modul vorgenommen werden, wirken sich auf das Verhalten sowohl der interaktiven Eingabeaufforderung des Interpreters als auch auf die durch die eingebaute Funktion input() angebotenen Eingabeaufforderungen aus.
Readline-Tastenkombinationen können über eine Initialisierungsdatei konfiguriert werden, typischerweise .inputrc in Ihrem Home-Verzeichnis. Informationen über das Format und zulässige Konstrukte dieser Datei sowie die Fähigkeiten der Readline-Bibliothek im Allgemeinen finden Sie unter Readline Init File im GNU Readline-Handbuch.
Verfügbarkeit: nicht Android, nicht iOS, nicht WASI.
Dieses Modul wird auf mobilen Plattformen oder WebAssembly-Plattformen nicht unterstützt.
Hinweis
Die zugrunde liegende Readline-Bibliotheks-API kann durch die Bibliothek editline (libedit) anstelle von GNU readline implementiert werden. Unter macOS erkennt das Modul readline zur Laufzeit, welche Bibliothek verwendet wird.
Die Konfigurationsdatei für editline unterscheidet sich von der von GNU readline. Wenn Sie Konfigurationsstrings programmgesteuert laden, können Sie backend verwenden, um festzustellen, welche Bibliothek verwendet wird.
Wenn Sie unter macOS die Emulation von editline/libedit readline verwenden, heißt die Initialisierungsdatei in Ihrem Home-Verzeichnis .editrc. Zum Beispiel schaltet der folgende Inhalt in ~/.editrc die vi-Tastenkombinationen und die TAB-Vervollständigung EIN.
python:bind -v
python:bind ^I rl_complete
Beachten Sie auch, dass verschiedene Bibliotheken unterschiedliche Verlaufsdateiformate verwenden können. Beim Wechseln der zugrunde liegenden Bibliothek können vorhandene Verlaufsdateien unbrauchbar werden.
- readline.backend¶
Der Name der zugrunde liegenden Readline-Bibliothek, die verwendet wird, entweder
"readline"oder"editline".Hinzugefügt in Version 3.13.
Initialisierungsdatei¶
Die folgenden Funktionen beziehen sich auf die Initialisierungsdatei und die Benutzerkonfiguration
- readline.parse_and_bind(string)¶
Führt die in string bereitgestellte Initialisierungszeile aus. Dies ruft
rl_parse_and_bind()in der zugrunde liegenden Bibliothek auf.
- readline.read_init_file([filename])¶
Führt eine Readline-Initialisierungsdatei aus. Der Standarddateiname ist der zuletzt verwendete Dateiname. Dies ruft
rl_read_init_file()in der zugrunde liegenden Bibliothek auf. Sie löst ein Audit-Ereignisopenmit dem Dateinamen aus, wenn dieser angegeben ist, andernfalls"<readline_init_file>", unabhängig davon, welche Datei die Bibliothek auflöst.Geändert in Version 3.14: Das Audit-Ereignis wurde hinzugefügt.
Zeilenpuffer¶
Die folgenden Funktionen arbeiten auf dem Zeilenpuffer
- readline.get_line_buffer()¶
Gibt den aktuellen Inhalt des Zeilenpuffers zurück (
rl_line_bufferin der zugrunde liegenden Bibliothek).
- readline.insert_text(string)¶
Fügt Text an der Cursorposition in den Zeilenpuffer ein. Dies ruft
rl_insert_text()in der zugrunde liegenden Bibliothek auf, ignoriert aber den Rückgabewert.
- readline.redisplay()¶
Ändert die Anzeige auf dem Bildschirm, um den aktuellen Inhalt des Zeilenpuffers widerzuspiegeln. Dies ruft
rl_redisplay()in der zugrunde liegenden Bibliothek auf.
Verlaufsdatei¶
Die folgenden Funktionen arbeiten auf einer Verlaufsdatei
- readline.read_history_file([filename])¶
Lädt eine Readline-Verlaufsdatei und hängt sie an die Verlaufsliste an. Der Standarddateiname ist
~/.history. Dies ruftread_history()in der zugrunde liegenden Bibliothek auf und löst ein Audit-Ereignisopenmit dem Dateinamen aus, wenn dieser angegeben ist, andernfalls"~/.history".Geändert in Version 3.14: Das Audit-Ereignis wurde hinzugefügt.
- readline.write_history_file([filename])¶
Speichert die Verlaufsliste in einer Readline-Verlaufsdatei und überschreibt dabei eine eventuell vorhandene Datei. Der Standarddateiname ist
~/.history. Dies ruftwrite_history()in der zugrunde liegenden Bibliothek auf und löst ein Audit-Ereignisopenmit dem Dateinamen aus, wenn dieser angegeben ist, andernfalls"~/.history".Geändert in Version 3.14: Das Audit-Ereignis wurde hinzugefügt.
- readline.append_history_file(nelements[, filename])¶
Hängt die letzten nelements Elemente des Verlaufs an eine Datei an. Der Standarddateiname ist
~/.history. Die Datei muss bereits existieren. Dies ruftappend_history()in der zugrunde liegenden Bibliothek auf. Diese Funktion existiert nur, wenn Python für eine Version der Bibliothek kompiliert wurde, die sie unterstützt. Sie löst ein Audit-Ereignisopenmit dem Dateinamen aus, wenn dieser angegeben ist, andernfalls"~/.history".Hinzugefügt in Version 3.5.
Geändert in Version 3.14: Das Audit-Ereignis wurde hinzugefügt.
- readline.get_history_length()¶
- readline.set_history_length(length)¶
Setzt oder gibt die gewünschte Anzahl von Zeilen zurück, die in der Verlaufsdatei gespeichert werden sollen. Die Funktion
write_history_file()verwendet diesen Wert, um die Verlaufsdatei zu kürzen, indemhistory_truncate_file()in der zugrunde liegenden Bibliothek aufgerufen wird. Negative Werte bedeuten unbegrenzte Größe der Verlaufsdatei.
Verlaufsliste¶
Die folgenden Funktionen arbeiten auf einer globalen Verlaufsliste
- readline.clear_history()¶
Löscht den aktuellen Verlauf. Dies ruft
clear_history()in der zugrunde liegenden Bibliothek auf. Die Python-Funktion existiert nur, wenn Python für eine Version der Bibliothek kompiliert wurde, die sie unterstützt.
- readline.get_current_history_length()¶
Gibt die Anzahl der Elemente zurück, die sich derzeit im Verlauf befinden. (Dies unterscheidet sich von
get_history_length(), das die maximale Anzahl von Zeilen zurückgibt, die in eine Verlaufsdatei geschrieben werden.)
- readline.get_history_item(index)¶
Gibt den aktuellen Inhalt des Verlaufsdatensatzes am index zurück. Der Index ist eins-basiert. Dies ruft
history_get()in der zugrunde liegenden Bibliothek auf.
- readline.remove_history_item(pos)¶
Entfernt den durch seine Position angegebenen Verlaufsdatensatz aus dem Verlauf. Die Position ist nullbasiert. Dies ruft
remove_history()in der zugrunde liegenden Bibliothek auf.
- readline.replace_history_item(pos, line)¶
Ersetzt den durch seine Position angegebenen Verlaufsdatensatz durch line. Die Position ist nullbasiert. Dies ruft
replace_history_entry()in der zugrunde liegenden Bibliothek auf.
- readline.add_history(line)¶
Hängt line an den Verlaufsbuffer an, als ob es die letzte eingegebene Zeile wäre. Dies ruft
add_history()in der zugrunde liegenden Bibliothek auf.
- readline.set_auto_history(enabled)¶
Aktiviert oder deaktiviert automatische Aufrufe von
add_history()beim Lesen von Eingaben über readline. Das Argument enabled sollte ein boolescher Wert sein, der bei True die automatische Verlaufsfunktion aktiviert und bei False deaktiviert.Hinzugefügt in Version 3.6.
CPython-Implementierungsdetail: Auto-History ist standardmäßig aktiviert, und Änderungen daran bleiben über mehrere Sitzungen hinweg nicht erhalten.
Start-Hooks¶
- readline.set_startup_hook([function])¶
Setzt oder entfernt die Funktion, die vom Rückruf
rl_startup_hookder zugrunde liegenden Bibliothek aufgerufen wird. Wenn function angegeben ist, wird sie als neue Hook-Funktion verwendet; wenn sie weggelassen oderNoneist, wird jede bereits installierte Funktion entfernt. Der Hook wird ohne Argumente aufgerufen, kurz bevor readline die erste Eingabeaufforderung ausgibt.
- readline.set_pre_input_hook([function])¶
Setzt oder entfernt die Funktion, die vom Rückruf
rl_pre_input_hookder zugrunde liegenden Bibliothek aufgerufen wird. Wenn function angegeben ist, wird sie als neue Hook-Funktion verwendet; wenn sie weggelassen oderNoneist, wird jede bereits installierte Funktion entfernt. Der Hook wird ohne Argumente aufgerufen, nachdem die erste Eingabeaufforderung ausgegeben wurde und kurz bevor readline beginnt, Eingabezeichen zu lesen. Diese Funktion existiert nur, wenn Python für eine Version der Bibliothek kompiliert wurde, die sie unterstützt.
Vervollständigung¶
Die folgenden Funktionen beziehen sich auf die Implementierung einer benutzerdefinierten Wortvervollständigungsfunktion. Dies wird normalerweise durch die Tab-Taste ausgelöst und kann ein eingegebenes Wort vorschlagen und automatisch vervollständigen. Standardmäßig ist Readline so eingerichtet, dass es von rlcompleter zur Vervollständigung von Python-Bezeichnern für den interaktiven Interpreter verwendet wird. Wenn das Modul readline mit einem benutzerdefinierten Vervollständiger verwendet werden soll, sollten andere Wortbegrenzer festgelegt werden.
- readline.set_completer([function])¶
Setzt oder entfernt die Vervollständigungsfunktion. Wenn function angegeben ist, wird sie als neue Vervollständigungsfunktion verwendet; wenn sie weggelassen oder
Noneist, wird jede bereits installierte Vervollständigungsfunktion entfernt. Die Vervollständigungsfunktion wird alsfunction(text, state)für state in0,1,2, … aufgerufen, bis sie einen Wert zurückgibt, der kein String ist. Sie sollte die nächste mögliche Vervollständigung zurückgeben, die mit text beginnt.Die installierte Vervollständigungsfunktion wird durch den Rückruf entry_func aufgerufen, der an
rl_completion_matches()in der zugrunde liegenden Bibliothek übergeben wird. Der String text stammt vom ersten Parameter des Rückrufsrl_attempted_completion_functionder zugrunde liegenden Bibliothek.
- readline.get_completer()¶
Ruft die Vervollständigungsfunktion ab oder
None, wenn keine Vervollständigungsfunktion festgelegt wurde.
- readline.get_completion_type()¶
Ruft den Typ der gerade versuchten Vervollständigung ab. Dies gibt die Variable
rl_completion_typein der zugrunde liegenden Bibliothek als Ganzzahl zurück.
- readline.get_begidx()¶
- readline.get_endidx()¶
Ruft den Start- oder Endindex des Vervollständigungsbereichs ab. Diese Indizes sind die start- und end-Argumente, die an den Rückruf
rl_attempted_completion_functionder zugrunde liegenden Bibliothek übergeben werden. Die Werte können im selben Eingabebearbeitungsszenario basierend auf der zugrunde liegenden C-Readline-Implementierung unterschiedlich sein. Z.B. ist bekannt, dass libedit anders funktioniert als libreadline.
- readline.set_completer_delims(string)¶
- readline.get_completer_delims()¶
Legt die Wortbegrenzer für die Vervollständigung fest oder ruft sie ab. Diese bestimmen den Anfang des Wortes, das für die Vervollständigung berücksichtigt werden soll (der Vervollständigungsbereich). Diese Funktionen greifen auf die Variable
rl_completer_word_break_charactersin der zugrunde liegenden Bibliothek zu.
- readline.set_completion_display_matches_hook([function])¶
Setzt oder entfernt die Anzeige der Vervollständigungsfunktion. Wenn function angegeben ist, wird sie als neue Vervollständigungsanzeigefunktion verwendet; wenn sie weggelassen oder
Noneist, wird jede bereits installierte Vervollständigungsanzeigefunktion entfernt. Dies setzt oder löscht den Rückrufrl_completion_display_matches_hookin der zugrunde liegenden Bibliothek. Die Vervollständigungsanzeigefunktion wird alsfunction(substitution, [matches], longest_match_length)einmal jedes Mal aufgerufen, wenn Übereinstimmungen angezeigt werden müssen.
Beispiel¶
Das folgende Beispiel zeigt, wie die Funktionen zum Lesen und Schreiben von Verläufen des Moduls readline verwendet werden, um eine Verlaufsdatei namens .python_history aus dem Home-Verzeichnis des Benutzers automatisch zu laden und zu speichern. Der folgende Code würde normalerweise während interaktiver Sitzungen aus der PYTHONSTARTUP-Datei des Benutzers ausgeführt werden.
import atexit
import os
import readline
histfile = os.path.join(os.path.expanduser("~"), ".python_history")
try:
readline.read_history_file(histfile)
# default history len is -1 (infinite), which may grow unruly
readline.set_history_length(1000)
except FileNotFoundError:
pass
atexit.register(readline.write_history_file, histfile)
Dieser Code wird tatsächlich automatisch ausgeführt, wenn Python im interaktiven Modus ausgeführt wird (siehe Readline-Konfiguration).
Das folgende Beispiel erreicht dasselbe Ziel, unterstützt aber gleichzeitige interaktive Sitzungen, indem nur der neue Verlauf angehängt wird.
import atexit
import os
import readline
histfile = os.path.join(os.path.expanduser("~"), ".python_history")
try:
readline.read_history_file(histfile)
h_len = readline.get_current_history_length()
except FileNotFoundError:
open(histfile, 'wb').close()
h_len = 0
def save(prev_h_len, histfile):
new_h_len = readline.get_current_history_length()
readline.set_history_length(1000)
readline.append_history_file(new_h_len - prev_h_len, histfile)
atexit.register(save, h_len, histfile)
Das folgende Beispiel erweitert die Klasse code.InteractiveConsole, um das Speichern/Wiederherstellen des Verlaufs zu unterstützen.
import atexit
import code
import os
import readline
class HistoryConsole(code.InteractiveConsole):
def __init__(self, locals=None, filename="<console>",
histfile=os.path.expanduser("~/.console-history")):
code.InteractiveConsole.__init__(self, locals, filename)
self.init_history(histfile)
def init_history(self, histfile):
readline.parse_and_bind("tab: complete")
if hasattr(readline, "read_history_file"):
try:
readline.read_history_file(histfile)
except FileNotFoundError:
pass
atexit.register(self.save_history, histfile)
def save_history(self, histfile):
readline.set_history_length(1000)
readline.write_history_file(histfile)