Постоянная история командной строки 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% вероятности) перекрытия.