2009-07-27 12 views
14

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

Odpowiedz

13

Myślę, że sugestie w dokumentacji Pythona prawie pokrywają to, co chcesz. Spójrz na przykładowy plik pystartup pod koniec sekcji 13.3:

lub znaleźć na tej stronie:

ale dla wyjęciu z pudełka powłoce interaktywnej, która zapewnia to wszystko i więcej, spójrz na użycie IPython:

+0

+1 dla iPython. –

+0

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! –

+0

Dzięki za to. Jesteś niesamowity. –

4

Spróbuj użyć IPython jako powłoki Pythona. Ma już wszystko, o co prosisz. Mają pakiety dla najpopularniejszych dystrybucji, więc instalacja powinna być bardzo łatwa.

+0

Zgadzam się. Używam ipython od jakiegoś czasu i jest fantastyczny, ma funkcję automatycznego uzupełniania i funkcję historii, której szukasz. – dalloliogm

+0

Używam IPython (dziś w systemie Windows), ale kiedy go uruchomię, moje klawisze strzałek w górę/w dół nie dają mi historii poleceń. Co ja robię źle? –

+2

ROZWIĄZANIE: "easy_install pyreadline", aby mieć klawisze strzałek w górę/w dół przeglądać historię poleceń w systemie Windows. Plus niektóre inne rzeczy (jak kolory!) Działają teraz. –

0

Zastosowanie PIP zainstalować pyreadline pakiet:

pip install pyreadline 
+0

Użyłem readline instalacji pip – Anoyz

0

Jeśli wszystko czego chcę to wykorzystać interaktywną historię podstawienie bez wszystkich rzeczy pliku, wszystko co musisz zrobić, to import readline:

import readline 

Następnie możesz użyć klawiszy w górę/w dół do nawigacji bramy poprzednich poleceń. To samo dla 2 lub 3.

To nie było dla mnie jasne z dokumentów, ale może przeoczyłem.

Powiązane problemy