Jak widzisz całą historię poleceń w interaktywnym Pythonie?

149

Pracuję nad domyślnym interpreterem języka Python w systemie Mac OS X i Cmd+ K(wyczyściłem) moje wcześniejsze polecenia. Mogę je przeglądać pojedynczo, używając klawiszy strzałek. Ale czy istnieje opcja taka jak --history w powłoce bash, która pokazuje wszystkie polecenia, które wprowadziłeś do tej pory?

Lavanya
źródło
Polecenie historypowłoki to program jak każdy inny. To nie jest „opcja” w bashpoleceniu.
Niloct,
6
Dokładniej: historyto wbudowana powłoka.
blinry,
3
W przypadku iPythona odpowiedź brzmi %history. A -gopcja pobiera wcześniejsze sesje .
Bob Stein
% history -g +% edit działa najlepiej
Dyno Fu

Odpowiedzi:

250

Kod do wydrukowania całej historii:

Python 3

Jedna linijka (szybkie kopiowanie i wklejanie):

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

(Lub dłuższa wersja ...)

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

Python 2

Jedna linijka (szybkie kopiowanie i wklejanie):

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

(Lub dłuższa wersja ...)

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

Uwaga : get_history_item()indeksowane jest od 1 do n.

Dennis Golomazov
źródło
31
Jedna wkładka:import readline; print '\n'.join([str(readline.get_history_item(i)) for i in range(readline.get_current_history_length())])
Matt
24
Ta odpowiedź (i jej nieprzykładowy odpowiednik) ilustruje, jak ważne są przykłady dla ludzi. Dzięki.
Tim S.
8
Chłodny! Dodałem history()funkcję z powyższym w moim skrypcie startowym interpretera Pythona (skrypt wskazywany przez env. Var $PYTHONSTARTUP). Od teraz mogę po prostu wpisać history()dowolną sesję tłumacza ;-)
sxc731
2
Za każdym razem, gdy zapominam, jak to się robi, przychodzę tu po odpowiedź, dziękuję Dennis.
Felipe Valdes
3
Zagrałem w tym, kto wie kiedy, i wróciłem, by jeszcze raz złapać tę dobroć. 👍🏽
berto
45

W przypadku interpretera Pythona 3 historia jest zapisywana
~/.python_history

Candide Guevara Marino
źródło
Nie mam tego katalogu i używam Pythona 3.5.2
Byłoby to dla systemów operacyjnych typu Unix. Udało mi się odzyskać moją historię na macOS zcat ~/.python_history
Ryanem H.
1
Dzięki za tę odpowiedź. Później znalazłem to w dokumentach tutaj: docs.python.org/3/library/site.html#readline-configuration
Jason V.
4
Niestety, wydaje się, że historia nie jest aktualizowana podczas korzystania ze środowisk wirtualnych: - /
ChrisFreeman,
4
Potrzebujesz quit()tłumacza, aby historia bieżącej sesji została uwzględniona~/.python_history
plexoos
9

Jeśli chcesz zapisać historię do pliku:

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

Funkcja pomocy daje:

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
źródło
czy to się utrzyma w sesjach Pythona, takich jak historia podważenia Rubiego?
lacostenycoder
Może ta odpowiedź została napisana przed funkcją readline, ale dlaczego nie użyć readline.write_history_file? @lacostenycoder Możesz użyć readline zarówno do odczytu, jak i zapisu pliku historii, który utrzymuje się.
Joe Holloway
@JoeHolloway Cool, dziękuję! Zmieniłem odpowiedź!
Martin Thoma
4

Ponieważ powyższe działa tylko dla pythona 2.x dla pythona 3.x (konkretnie 3.5) jest podobne, ale z niewielką modyfikacją:

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

zwróć uwagę na dodatkowe ()

(używanie skryptów powłoki do parsowania .python_history lub używanie Pythona do modyfikacji powyższego kodu jest kwestią osobistego gustu i sytuacji imho)

Jeff Cliff
źródło
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 `BŁĄD: Polecenie" python setup.py egg_info "nie powiodło się z kodem błędu 1 w C: \ Users \ dblack \ AppData \ Local \ Temp \ pip-install-s6m4zkdw \ readline`
bballdave025
1
@ bballdave025 Tak, nie możesz pip install readline, ale readlinejest on instalowany domyślnie w systemie Windows.
Josiah Yoder
Cóż, to ułatwia sprawę. Dzięki @JosiahYoder
bballdave025
@ bballdave025 Od tego czasu dowiedziałem się, że nie jest instalowany domyślnie w systemie Windows, ale jeśli podążasz za linkiem, instrukcje podają szczegóły - coś w rodzaju instalacji pyreadline lub czegoś takiego.
Josiah Yoder
4

W IPythonie %history -gnależy podać całą historię poleceń. Domyślna konfiguracja zapisuje również historię w pliku o nazwie .python_history w katalogu użytkownika.

Yossarian42
źródło
3

Prosta funkcja, aby uzyskać historię podobną do wersji unix / bash.

Mam nadzieję, że pomoże to niektórym nowym ludziom.

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: Testowane w Pythonie3. Daj mi znać, jeśli są jakieś usterki w Pythonie2. Próbki:

Pełna historia: ipyhistory()

Ostatnie 10 historii: ipyhistory(10)

Pierwsze 10 historii: ipyhistory(-10)

Mam nadzieję, że to pomaga ludziom.

Doogle
źródło
Cześć, dzięki. Umieściłem Twój fragment kodu w pliku xx.py. potem po otwarciu Pythona zaimportowałem xx. Następnie próbowałem ipyhistory (), ale jest napisane, ">>> ipyhistory Traceback (ostatnie wywołanie ostatnie): Plik" <stdin> ", wiersz 1, w <module> NameError: name 'ipyhistory' nie jest zdefiniowana". Co jest nie tak?
Chan Kim
Mam zmieniony to nie drukować numery linii od tych, zazwyczaj w sposób jak dla mnie, ale podobała mi się możliwość korekty ograniczające. (Nawet na Unixie, zwykle cut -c 8je wychodzę.)
Josiah Yoder
1

@ Jason-V, to naprawdę pomaga, dzięki. następnie znalazłem te przykłady i utworzyłem własny fragment.

#!/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
źródło
1

To powinno dać ci polecenia wydrukowane w oddzielnych wierszach:

import readline
map(lambda p:print(readline.get_history_item(p)),
    map(lambda p:p, range(readline.get_current_history_length()))
)
Idea4life
źródło
Czy możesz podać bardziej szczegółowe informacje na temat formatowania kodu? Czy mówisz, że nawiasy nie pasują?
Idea4life
Poprawiłem formatowanie za pomocą prostego wcięcia. @AleksAndreev możesz usunąć swój głos przeciw.
ChrisFreeman,
0

Powtórzenie odpowiedzi Doogle , która nie wypisuje numerów linii, ale pozwala określić liczbę linii do wydrukowania.

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
źródło