Persistenter Python-Befehlszeilenverlauf

Ich möchte in der Lage sein, Befehle, die ich in einem früheren Python-Interpreter eingegeben habe, mit einem "Pfeil nach oben" zu beantworten. Ich habe das gefundenreadline Modul, das Funktionen bietet wie:read_history_file, write_history_file, undset_startup_hook. Ich bin aber nicht geschickt genug, um dies in die Praxis umzusetzen. Könnte also jemand bitte helfen? Meine Gedanken zur Lösung sind:

(1) Ändern Sie .login PYTHONSTARTUP, um ein Python-Skript auszuführen. (2) Führen Sie in dieser Python-Skriptdatei Folgendes aus:

def command_history_hook():
    import readline
    readline.read_history_file('.python_history')
command_history_hook()

(3) Schreiben Sie bei jedem Beenden des Interpreters den Verlauf in die Datei. Ich denke, der beste Weg, dies zu tun, besteht darin, eine Funktion in Ihrem Startskript zu definieren und mit dieser Funktion zu beenden:

def ex():
    import readline
    readline.write_history_file('.python_history')
    exit()

Es ist jedoch sehr ärgerlich, mit runden Klammern beenden zu müssen:ex(). Gibt es etwas Pythonzucker, der erlauben würdeex (ohne die parens) das laufen zu lassenex Funktion?

Gibt es eine bessere Möglichkeit, die Verlaufsdatei jedes Mal zum Schreiben zu bringen? Vielen Dank im Voraus für alle Lösungen / Vorschläge.

Es gibt auch zwei architektonische Möglichkeiten, wie ich sehen kann. Eine Möglichkeit besteht darin, einen einheitlichen Befehlsverlauf zu haben. Der Vorteil liegt in der Einfachheit (die Alternative, die folgt, wenn Ihr Ausgangsverzeichnis mit vielen Dateien übersät ist). Der Nachteil besteht darin, dass die Interpreter, die Sie in separaten Terminals ausführen, mit den Befehlsverläufen der jeweils anderen gefüllt werden und die Verläufe der anderen überschreiben. (Dies ist in Ordnung für mich, da ich normalerweise daran interessiert bin, einen Interpreter zu schließen und sofort wieder zu öffnen, um Module neu zu laden. In diesem Fall wurden die Befehle des Interpreters in die Datei geschrieben.) Eine mögliche Lösung, um separate Verlaufsdateien pro Terminal zu verwalten So schreiben Sie eine Umgebungsvariable für jedes neue Terminal, das Sie erstellen:

def random_key()
    ''.join([choice(string.uppercase + string.digits) for i in range(16)])

def command_history_hook():
    import readline
    key = get_env_variable('command_history_key')
    if key:
        readline.read_history_file('.python_history_{0}'.format(key))
    else:
        set_env_variable('command_history_key', random_key())

def ex():
    import readline
    key = get_env_variable('command_history_key')
    if not key:
        set_env_variable('command_history_key', random_key())
    readline.write_history_file('.python_history_{0}'.format(key))
    exit()

Durch Verringern der zufälligen Schlüssellänge von 16 auf 1 können Sie die Anzahl der in Ihren Verzeichnissen verstreuten Dateien auf Kosten einer möglichen Überlappung (2,8%) auf 36 verringern.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage