Trwała historia wiersza poleceń Pythona
Chciałbym móc „strzelać w górę” do poleceń, które wprowadzam w poprzednim interpreterze Pythona. Znalazłemreadline
moduł, który oferuje funkcje takie jak:read_history_file
, write_history_file
, iset_startup_hook
. Nie jestem jednak na tyle mądry, aby zastosować to w praktyce, więc czy ktoś mógłby mi pomóc? Moje przemyślenia na temat rozwiązania to:
(1) Zmodyfikuj .login PYTHONSTARTUP, aby uruchomić skrypt Pythona. (2) W tym pliku skryptu Pythona wykonaj coś takiego:
def command_history_hook():
import readline
readline.read_history_file('.python_history')
command_history_hook()
(3) Za każdym razem, gdy interpreter kończy działanie, zapisz historię do pliku. Myślę, że najlepszym sposobem na to jest zdefiniowanie funkcji w skrypcie startowym i wyjście z tej funkcji:
def ex():
import readline
readline.write_history_file('.python_history')
exit()
Bardzo irytujące jest wyjście z nawiasów, ale:ex()
. Czy jest jakiś cukier python, który by na to pozwoliłex
(bez parens), aby uruchomićex
funkcjonować?
Czy jest lepszy sposób, aby za każdym razem zapisywać plik historii? Z góry dziękuję za wszystkie rozwiązania / sugestie.
Są też dwie opcje architektoniczne, które widzę. Jednym wyborem jest posiadanie zunifikowanej historii poleceń. Zaletą jest prostota (alternatywa, która następuje po miotach twojego katalogu domowego z dużą ilością plików.) Wadą jest to, że tłumacze, których używasz w osobnych terminalach, będą wypełniani historiami poleceń innych użytkowników i będą nadpisywać swoje historie. (jest to dla mnie w porządku, ponieważ zazwyczaj jestem zainteresowany zamknięciem interpretera i jego ponownym otwarciem, aby przeładować moduły, iw takim przypadku polecenia interpretera zostaną zapisane w pliku.) Jedno z możliwych rozwiązań do utrzymania oddzielnych plików historii na terminal jest napisanie zmiennej środowiskowej dla każdego nowego terminalu, który tworzysz:
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()
Zmniejszając losową długość klucza z 16 do 1, można zmniejszyć liczbę plików zaśmiecających katalogi do 36 kosztem możliwego (2,8% szansy) nakładania się.