Chciałbym móc "strzałką w górę" do poleceń, które wprowadzam w poprzednim interpretera Pythona. Znalazłem moduł readline
, który oferuje funkcje takie jak: read_history_file
, write_history_file
i set_startup_hook
. Nie jestem na tyle sprytny, żeby to zastosować, więc czy ktoś mógłby mi pomóc? Moje przemyślenia na temat rozwiązania są następujące:Persistent Python Command-Line History
(1) Zmodyfikuj .login PYTHONSTARTUP, aby uruchomić skrypt Pythona. (2) W tym pliku skryptu Pythona zrobić coś takiego:
def command_history_hook():
import readline
readline.read_history_file('.python_history')
command_history_hook()
(3) Gdy wychodzi tłumacza napisać historię do pliku. Chyba najlepszym sposobem na to jest do definiowania funkcji w skrypt startowy i wyjść za pomocą tej funkcji:
def ex():
import readline
readline.write_history_file('.python_history')
exit()
To bardzo irytujące musiał opuścić za pomocą nawiasów, choć: ex()
. Czy jest jakiś cukier python, który pozwoliłby ex
(bez parens) na uruchomienie funkcji ex
?
Czy istnieje lepszy sposób, aby spowodować zapisanie pliku historii za każdym razem? Z góry dziękuję za wszystkie rozwiązania/sugestie.
Są też dwie opcje architektoniczne, jakie widzę. Jednym z nich jest posiadanie zunifikowanej historii poleceń. Zaletą jest prostota (alternatywa, która podąża za katalogami domowymi z dużą ilością plików). Wadą jest to, że tłumacze, których używasz w oddzielnych terminalach, będą zapełniać się historiami poleceń innych nawzajem i będą nadpisywać swoje historie. (jest to dla mnie w porządku, ponieważ zwykle jestem zainteresowany zamknięciem interpretera i ponownym otwarciem, aby odświeżyć moduły, iw takim przypadku do pliku zostaną zapisane polecenia tłumacza.) Jedno możliwe rozwiązanie do utrzymywania osobnych plików historii na terminalu jest napisanie zmienną środowiskową dla każdego nowego terminalu tworzyć:
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 losowego klucza długość od 16 do powiedzmy 1 można zmniejszyć liczbę plików zaśmiecaniu katalogów do 36 kosztem możliwe (2,8 % szansy) nakładania się.
+1 dla iPython. –
Dzięki temu zmienna env PYTHONSTARTUP i funkcja atexit.register są tym, co chciałem. Na podstawie wprowadzonych danych prawdopodobnie użyję iPython. dzięki! –
Dzięki za to. Jesteś niesamowity. –