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ę.

questionAnswers(5)

yourAnswerToTheQuestion