Постоянная история командной строки Python

Я хотел бы иметь возможность "стрелка вверх" к командам, которые я ввел в предыдущем интерпретаторе Python. Я нашелreadline модуль, который предлагает функции, такие как:read_history_file, write_history_file, а такжеset_startup_hook, Я не достаточно подкован, чтобы применить это на практике, так что, может, кто-то может помочь? Мои мысли о решении:

(1) Измените .login PYTHONSTARTUP для запуска скрипта Python. (2) В этом файле скрипта Python сделайте что-то вроде:

def command_history_hook():
    import readline
    readline.read_history_file('.python_history')
command_history_hook()

(3) Каждый раз, когда переводчик выходит, запишите историю в файл. Я думаю, что лучший способ сделать это - определить функцию в вашем скрипте запуска и завершить работу, используя эту функцию:

def ex():
    import readline
    readline.write_history_file('.python_history')
    exit()

Это очень раздражает, когда приходится выходить, используя круглые скобки, хотя:ex(), Есть ли немного сахара на питоне, который позволил быex (без паренов), чтобы запуститьex функционировать?

Есть ли лучший способ заставить файл истории писать каждый раз? Заранее спасибо за все решения / предложения.

Кроме того, как я вижу, есть два варианта архитектуры. Один из вариантов - иметь единую историю команд. Преимущество заключается в простоте (альтернатива, которая следует, засыпает ваш домашний каталог большим количеством файлов.) Недостатком является то, что интерпретаторы, которые вы запускаете в отдельных терминалах, будут заполняться историями команд друг друга и перезаписывать истории друг друга. , (это нормально для меня, так как я обычно заинтересован в том, чтобы закрыть интерпретатор и сразу же открыть его для перезагрузки модулей, и в этом случае команды интерпретатора будут записаны в файл.) Одно из возможных решений для поддержки отдельных файлов истории для каждого терминала нужно написать переменную окружения для каждого нового создаваемого вами терминала:

def random_key()
    ''.join([choice(string.uppercase + string.digits) for i in range(16)])

def command_history_hook():
    import readline
    key = get_env_variable('command_history_key')
    if key:
        readline.read_history_file('.python_history_{0}'.format(key))
    else:
        set_env_variable('command_history_key', random_key())

def ex():
    import readline
    key = get_env_variable('command_history_key')
    if not key:
        set_env_variable('command_history_key', random_key())
    readline.write_history_file('.python_history_{0}'.format(key))
    exit()

Уменьшая длину случайного ключа с 16 до 1, вы можете уменьшить количество файлов, засоряющих ваши каталоги, до 36 за счет возможного (2,8% вероятности) перекрытия.

Ответы на вопрос(5)

Ваш ответ на вопрос