Wie sehen Sie den gesamten Befehlsverlauf in interaktivem Python?

149

Ich arbeite an dem Standard-Python-Interpreter unter Mac OS X und habe meine früheren Befehle Cmd+ K(gelöscht). Ich kann sie einzeln mit den Pfeiltasten durchgehen. Aber gibt es eine Option wie die Option --history in der Bash-Shell, die Ihnen alle Befehle zeigt, die Sie bisher eingegeben haben?

Lavanya
quelle
Der historyShell-Befehl ist ein Programm wie jedes andere. Es ist keine "Option" im bashBefehl.
Niloct
6
Um genau zu sein: historyist eine Shell eingebaut.
Blinry
3
Für iPython lautet die Antwort %history. Und die -gOption erhält frühere Sitzungen .
Bob Stein
% history -g +% edit funktioniert am besten
Dyno Fu
Habe gerade die entsprechende Frage für Windows 10 gestellt
Josiah Yoder

Antworten:

250

Code zum Drucken des gesamten Verlaufs:

Python 3

Einzeiler (schnelles Kopieren und Einfügen):

import readline; print('\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())]))

(Oder längere Version ...)

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

Python 2

Einzeiler (schnelles Kopieren und Einfügen):

import readline; print '\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())])

(Oder längere Version ...)

import readline
for i in range(readline.get_current_history_length()):
    print readline.get_history_item(i + 1)

Hinweis : get_history_item()ist von 1 bis n indiziert.

Dennis Golomazov
quelle
31
Ein Liner:import readline; print '\n'.join([str(readline.get_history_item(i)) for i in range(readline.get_current_history_length())])
Matt
24
Diese Antwort (und ihr nicht beispielhaftes Gegenstück) zeigt beispielhaft, wie wichtig Beispiele für Menschen sind. Vielen Dank.
Tim S.
8
Cool! Ich habe history()in meinem Python-Interpreter-Startskript eine Funktion wie oben hinzugefügt (ein Skript, auf das env. Var verweist $PYTHONSTARTUP). Von nun an kann ich einfach history()jede Dolmetschersitzung
eingeben ;-)
2
Jedes Mal, wenn ich vergesse, wie das gemacht wird, komme ich hierher, um die Antwort zu erhalten, danke Dennis.
Felipe Valdes
3
Ich habe das mitgespielt, wer weiß wann und ich bin zurück, um mir diese Güte noch einmal zu schnappen. 👍🏽
Berto
45

Mit dem Python 3-Interpreter wird der Verlauf geschrieben
~/.python_history

Candide Guevara Marino
quelle
Ich habe dieses Verzeichnis nicht und ich benutze Python 3.5.2
Dies wäre für Unix-ähnliche Betriebssysteme. Ich konnte meine Geschichte unter macOS mitcat ~/.python_history
Ryan H.
1
Danke für diese Antwort. Ich fand dies später in den Dokumenten hier: docs.python.org/3/library/site.html#readline-configuration
Jason V.
4
Leider scheint der Verlauf bei Verwendung virtueller Umgebungen nicht aktualisiert zu werden: - /
ChrisFreeman
4
Sie müssen quit()den Dolmetscher, damit der aktuelle Sitzungsverlauf in~/.python_history
plexoos
9

Wenn Sie den Verlauf in eine Datei schreiben möchten:

import readline
readline.write_history_file('python_history.txt')

Die Hilfefunktion gibt:

Help on built-in function write_history_file in module readline:

write_history_file(...)
    write_history_file([filename]) -> None
    Save a readline history file.
    The default filename is ~/.history.
Martin Thoma
quelle
Wird dies über Python-Sitzungen wie Rubys Stemmen-Geschichte hinweg bestehen bleiben?
Lacostenycoder
Vielleicht wurde diese Antwort vor der Readline-Funktion geschrieben, aber warum nicht readline.write_history_file verwenden? @lacostenycoder Mit readline können Sie eine fortlaufende Verlaufsdatei lesen und schreiben.
Joe Holloway
@ JoeHolloway Cool, danke! Ich habe die Antwort geändert!
Martin Thoma
4

Da das oben genannte nur für Python 2.x funktioniert, ist Python 3.x (speziell 3.5) ähnlich, jedoch mit einer geringfügigen Änderung:

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

beachte das extra ()

(Die Verwendung von Shell-Skripten zum Parsen von .python_history oder die Verwendung von Python zum Ändern des obigen Codes ist imho eine Frage des persönlichen Geschmacks und der Situation.)

Jeff Cliff
quelle
3
Win10 C:\>python -m pip install readline=> Collecting readline\ n Downloading https://files.pythonhosted.org/packages/f4/01/2cf081af8d880b44939a5f1b446551a7f8d59eae414277fd0c303757ff1b/readline-6.2.4.1.tar.gz (2.3MB)\ n |████████████████████████████████| 2.3MB 1.7MB/s\ n ERROR: Complete output from command python setup.py egg_info:\ n ERROR: error: this module is not meant to work on Windows\ n ----------------------------------------\ n `FEHLER: Der Befehl" python setup.py egg_info "ist mit Fehlercode 1 in C: \ Users \ dblack \ AppData \ Local \ Temp \ pip-install-s6m4zkdw fehlgeschlagen \ readline`
bballdave025
1
@ bballdave025 Ja, das kannst du nicht pip install readline, ist aber readlinestandardmäßig unter Windows installiert.
Josiah Yoder
Das macht die Sache einfacher. Danke @JosiahYoder
bballdave025
@ bballdave025 Ich habe seitdem erfahren, dass es nicht standardmäßig unter Windows installiert ist, aber wenn Sie dem Link folgen, geben die Anweisungen Details - so etwas wie die Installation von pyreadline oder so.
Josiah Yoder
4

In IPython %history -gsollte Ihnen der gesamte Befehlsverlauf angezeigt werden. Die Standardkonfiguration speichert Ihren Verlauf auch in einer Datei mit dem Namen .python_history in Ihrem Benutzerverzeichnis.

Yossarian42
quelle
3

Eine einfache Funktion, um den Verlauf ähnlich der Unix / Bash-Version abzurufen.

Hoffe, es hilft einigen neuen Leuten.

def ipyhistory(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        flen = len(str(hlen)) if not lastn else len(str(lastn))
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(": ".join([str(r if not lastn else r + lastn - hlen ).rjust(flen), readline.get_history_item(r)]))
    else:
        flen = len(str(-hlen))
        for r in range(1, -lastn + 1):
            print(": ".join([str(r).rjust(flen), readline.get_history_item(r)]))

Snippet: Getestet mit Python3. Lassen Sie mich wissen, ob es bei python2 Störungen gibt. Proben:

Vollständige Geschichte: ipyhistory()

Letzte 10 Geschichte: ipyhistory(10)

Erste 10 Geschichte: ipyhistory(-10)

Hoffe es hilft Jungs.

Doogle
quelle
Hallo danke. Ich habe Ihr Code-Snippet in eine Datei xx.py umgewandelt. dann habe ich nach dem öffnen von python xx importiert. Dann habe ich ipyhistory () ausprobiert, aber es heißt ">>> ipyhistory Traceback (letzter Aufruf zuletzt): Datei" <stdin> ", Zeile 1, in <module> NameError: Name 'ipyhistory' ist nicht definiert". Was ist los mit dir?
Chan Kim
Ich habe dies überarbeitet, um keine Zeilennummern zu drucken, da diese mir normalerweise im Weg stehen, aber ich mochte die Fähigkeit zur Zeilenbegrenzung. (Selbst unter Unix habe ich sie normalerweise cut -c 8raus.)
Josiah Yoder
1

@ Jason-V, es hilft wirklich, danke. Dann fand ich diese Beispiele und komponierte sie zu einem eigenen Snippet.

#!/usr/bin/env python3
import os, readline, atexit
python_history = os.path.join(os.environ['HOME'], '.python_history')
try:
  readline.read_history_file(python_history)
  readline.parse_and_bind("tab: complete")
  readline.set_history_length(5000)
  atexit.register(readline.write_history_file, python_history)
except IOError:
  pass
del os, python_history, readline, atexit 
dzNET
quelle
1

Dies sollte Ihnen die Befehle geben, die in separaten Zeilen ausgedruckt werden:

import readline
map(lambda p:print(readline.get_history_item(p)),
    map(lambda p:p, range(readline.get_current_history_length()))
)
Idea4life
quelle
Können Sie bitte genauer auf die Formatierung des Codes eingehen? Wollen Sie damit sagen, dass die Klammern nicht übereinstimmen?
Idea4life
Ich habe die Formatierung mit einem einfachen Einzug korrigiert. @AleksAndreev Sie können Ihre Downvote entfernen.
ChrisFreeman
0

Wiederholung der Antwort von Doogle , bei der keine Zeilennummern gedruckt werden, sondern die Anzahl der zu druckenden Zeilen angegeben werden kann.

def history(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(readline.get_history_item(r))
    else:
        for r in range(1, -lastn + 1):
            print(readline.get_history_item(r))
Josiah Yoder
quelle