Як ви бачите всю історію команд в інтерактивному Python?


149

Я працюю над інтерпретатором python за замовчуванням на Mac OS X, і я Cmd+ K(очистив) свої попередні команди. Я можу переглядати їх по черзі за допомогою клавіш зі стрілками. Але чи є такий варіант, як параметр --history в bash shell, який показує вам усі команди, які ви ввели до цього часу?


Команда historyshell - це програма, як і будь-яка інша. Це не "варіант" в bashкоманді.
Нілокт

6
Якщо бути точним: historyце вбудована оболонка.
блін

3
Відповідь для iPython є %history. І -gваріант отримує більш ранні сеанси .
Боб Штейн

% історія -g +% редагування найкраще працює
Dyno Fu

Відповіді:



250

Код для друку всієї історії:

Пітон 3

Одне вкладиш (швидка копія та вставка)

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

(Або довша версія ...)

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

Пітон 2

Одне вкладиш (швидка копія та вставка)

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

(Або довша версія ...)

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

Примітка : get_history_item()індексується від 1 до n.


31
Один лайнер:import readline; print '\n'.join([str(readline.get_history_item(i)) for i in range(readline.get_current_history_length())])
Метт

24
Ця відповідь (та її неприкладний аналог) ілюструє, наскільки важливі приклади для людей. Дякую.
Тім С.

8
Класно! Я додав history()функцію з вищезазначеним у свій запуск сценарію інтерпретатора Python (сценарій, на який вказує середовище var $PYTHONSTARTUP). Відтепер я можу просто набрати history()будь-який сеанс перекладача ;-)
sxc731

2
Кожен раз, коли я забуваю, як це робиться, я приходжу сюди за відповідь, дякую Деннісе.
Феліпе Вальдес

3
Я це зняв, хто знає коли, і я знову повернувся до цього добра. 👍🏽
Берто

45

З інтерпретатором python 3 записується історія
~/.python_history


У мене немає цього каталогу і я використовую Python 3.5.2

Це було б для ОС, схожих на Unix. Мені вдалося отримати свою історію на macOS за допомогоюcat ~/.python_history
Райана Х.

1
Дякую за цю відповідь. Пізніше я знайшов це в документах тут: docs.python.org/3/library/site.html#readline-configuration
Джейсон В.

4
На жаль, історія не оновлюється при використанні віртуальних середовищ: - /
ChrisFreeman

4
Вам потрібно, щоб quit()перекладач включив поточну історію сеансів~/.python_history
plexoos

9

Якщо ви хочете написати історію у файл:

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

Функція довідки дає:

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.

чи збережеться це протягом сеансів пітону, як історія виходу рубіну?
лакостенікодер

Можливо, ця відповідь була написана перед функцією readline, але чому б не використовувати readline.write_history_file? @lacostenycoder Ви можете використовувати readline як для читання, так і для запису файла історії, який зберігається.
Джо Холлоуей

@JoeHolloway Класно, дякую! Я змінив відповідь!
Мартін Тома

4

Оскільки вищезазначене працює лише для python 2.x, для python 3.x (конкретно 3.5) схоже, але з незначною модифікацією:

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

зверніть увагу на додаткове ()

(використання скриптів оболонки для розбору .python_history або використання python для зміни вищевказаного коду - це питання особистого смаку та ситуації imho)


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 `ПОМИЛКА: Команда" python setup.py egg_info "не вдалася з кодом помилки 1 в C: \ Users \ dblack \ AppData \ Local \ Temp \ pip-install-s6m4zkdw \ readline`
bballdave025

1
@ bballdave025 Так, ви не можете pip install readline, але readlineвстановлено за замовчуванням у Windows.
Йосія Йодер

Ну, це полегшує справи. Дякую @JosiahYoder
bballdave025

@ bballdave025 З тих пір я дізнався, що він не встановлений за замовчуванням у Windows, але якщо ви переходите за посиланням, в інструкціях наведено деталі - щось на зразок встановлення pyreadline чи чогось іншого.
Йосія Йодер

4

В IPython %history -gслід дати вам всю історію команд. Конфігурація за замовчуванням також зберігає вашу історію у файл з назвою .python_history у вашому каталозі користувачів.


3

Проста функція, щоб отримати історію, подібну до версії unix / bash.

Сподіваюся, це допомагає новим людям.

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)]))

Знімок: Тестований з Python3. Повідомте мене, чи є глюки з python2. Зразки:

Повна історія: ipyhistory()

Останні 10 історій: ipyhistory(10)

Перша 10 історія: ipyhistory(-10)

Сподіваюся, це допомагає хлопцям.


привіт, спасибі Я зробив ваш фрагмент коду у файл xx.py. потім після відкриття python я імпортував xx. Після цього я спробував ipyhistory (), але в ньому написано: ">>> ipyhistory Traceback (останній дзвінок останній): Файл" <stdin> ", рядок 1, в <module> NameError: ім'я 'ipyhistory' не визначено". Що не так?
Чан Кім

Я переглянув це, щоб не друкувати номери рядків, оскільки вони зазвичай заважають мені, але мені сподобалася можливість обмеження рядків. (Навіть на Unix я зазвичай cut -c 8їх випускаю.)
Йосія Йодер

1

@ Jason-V, це дуже допомагає, дякую. то я знайшов ці приклади і склав власний фрагмент.

#!/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 

1

Це повинно дати вам команди, роздруковані в окремих рядках:

import readline
map(lambda p:print(readline.get_history_item(p)),
    map(lambda p:p, range(readline.get_current_history_length()))
)

Чи можете ви бути більш конкретними щодо форматування коду? Ви говорите, що дужки не збігаються?
Idea4life

Я виправив форматування за допомогою простого відступу. @AleksAndreev ви можете вилучити свій голос.
ChrisFreeman

0

Переспів Doogle відповіді «s , яка не Printline числа, але дозволяє вказати кількість рядків для друку.

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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.