Как вы видите всю историю команд в интерактивном Python? - PullRequest
121 голосов
/ 02 июля 2011

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

Ответы [ 9 ]

199 голосов
/ 10 августа 2011

Код для печати всей истории (только для дальнейшего использования):

python2

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

python3

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

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

56 голосов
/ 02 июля 2011

Используйте readline.get_current_history_length() для получения длины и readline.get_history_item() для просмотра каждого.

33 голосов
/ 21 августа 2016

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

4 голосов
/ 17 мая 2017

Поскольку вышеприведенное работает только для 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)

2 голосов
/ 11 февраля 2019

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

2 голосов
/ 30 сентября 2018

Простая функция для получения истории, аналогичной версии 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)

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

2 голосов
/ 01 декабря 2017

Если вы хотите записать историю в файл:

import readline
with open('pyhistory.txt', 'w') as f:
    for i in range(readline.get_current_history_length()):
        f.write(readline.get_history_item(i + 1) + "\n")
1 голос
/ 17 октября 2017

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

import readline
map(lambda p:print(readline.get_history_item(p)),
    map(lambda p:p, range(readline.get_current_history_length()))
)
0 голосов
/ 20 ноября 2017

@ Джейсон-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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...