Как вы видите всю историю команд в интерактивном Python?

150

Я работаю над интерпретатором Python по умолчанию в Mac OS X, и я Cmd+ K(очистил) мои предыдущие команды. Я могу просмотреть их один за другим, используя клавиши со стрелками. Но есть ли такая опция, как опция --history в оболочке bash, которая показывает все команды, которые вы ввели на данный момент?

Lavanya
источник
Команда historyshell - это программа, как и любая другая. Это не «опция» в bashкоманде.
Niloct
6
Чтобы быть точным: historyэто встроенная оболочка.
blinry
3
Для iPython ответ таков%history . И -gопция получает более ранние сессии .
Боб Стейн
% history -g +% edit лучше всего работает
Dyno Fu
Только что задал эквивалентный вопрос для Windows 10
Иосия Йодер

Ответы:

251

Код для печати всей истории:

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

Python 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 (скрипт, на который указывает env. Var $PYTHONSTARTUP). Отныне я могу просто вводить history()
текст
2
Каждый раз, когда я забываю, как это делается, я прихожу сюда за ответом, спасибо, Деннис.
Фелипе Вальдес
3
Я снялся в роли этого, кто знает, когда, и я вернулся, чтобы поймать это совершенство еще раз. 👍🏽
Берто
45

С интерпретатором Python 3 история записывается в
~/.python_history

Кандид Гевара Марино
источник
У меня нет этого каталога, и я использую Python 3.5.2
Это было бы для Unix-подобных ОС. Я смог получить свою историю на macOS сcat ~/.python_history
Райан Х.
1
Спасибо за этот ответ. Позже я обнаружил, что это описано
Джейсон В.
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.
Мартин Тома
источник
будет ли это сохраняться в сеансах Python, например, в истории ruby?
lacostenycoder
Может быть, этот ответ был написан до функции 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 в вашем пользовательском каталоге.

Yossarian42
источник
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)

Надеюсь, это поможет ребятам.

Doogle
источник
Привет спасибо. Я сделал ваш фрагмент кода в файл xx.py. Затем, после открытия Python, я импортировал хх. Затем я попробовал ipyhistory (), но там написано: «>>> ipehistory Traceback (последний вызов был последним): файл« <stdin> », строка 1, в <module> NameError: имя« ipyhistory »не определено». В чем дело?
Чан Ким
Я изменил это, чтобы не печатать номера строк, так как они обычно мешают мне, но мне понравилась возможность ограничения строк. (Даже на Unix я обычно cut -c 8их выхожу.)
Джосия Йодер
1

@ Джейсон-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 
dzNET
источник
1

Это должно дать вам команды, напечатанные в отдельных строках:

import readline
map(lambda p:print(readline.get_history_item(p)),
    map(lambda p:p, range(readline.get_current_history_length()))
)
Idea4life
источник
Можете ли вы быть более конкретным по форматированию кода? Вы говорите, что скобки не совпадают?
Idea4life
Я исправил форматирование с помощью простого отступа. @AleksAndreev Вы можете удалить свое пониженное голосование.
ChrisFreeman
0

Перефразировать ответ Doogle , который не печатает номера строк, но позволяет указать количество строк для печати.

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))
Иосия Йодер
источник