Jak powtórzyć ostatnie polecenie w powłoce interpretera Pythona?


137

Jak powtórzyć ostatnie polecenie? Zwykłe klawisze: Up, Ctrl + Up, Alt-p nie działają. Tworzą bezsensowne postacie.

(ve)[kakarukeys@localhost ve]$ python
Python 2.6.6 (r266:84292, Nov 15 2010, 21:48:32) 
[GCC 4.4.4 20100630 (Red Hat 4.4.4-10)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print "hello world"
hello world
>>> ^[[A
  File "<stdin>", line 1
    ^
SyntaxError: invalid syntax
>>> ^[[1;5A
  File "<stdin>", line 1
    [1;5A
    ^
SyntaxError: invalid syntax
>>> ^[p
  File "<stdin>", line 1
    p
    ^
SyntaxError: invalid syntax
>>> 

Strzałka w górę działa poprawnie dla mnie (Ubuntu), to dziwne.
— Vincent Savard

3
Tak samo, strzałka w górę działa dla mnie w systemie Windows. Jakiej powłoki używasz i jakiego programu terminalowego w jakim systemie operacyjnym?
— fmark

Zainstalowałem osobną instalację Pythona 2.6.6 w Fedorze 13, uruchom virtualenv, używając domyślnej powłoki Pythona, na gnome-terminal
— kakarukeys

5
tylko informacja do Twojej wiadomości, te „bezsensowne” znaki to „sekwencje specjalne” opracowane przez DEC i innych w czasach, gdy komputery mainframe były dostępne przez terminale przez linie telefoniczne. ^ [to ESC (ucieczka), ^ [[to ucieczka- [lub CSI (inicjator sekwencji kontrolnej, IIRC), a CSI-A to sekwencja "w górę". a kiedy włączysz ncurses, używając poniższej odpowiedzi, te sekwencje są interpretowane, a nie wyświetlane.
— jcomeau_ictx

4
Miałem ten problem z powodu instalacji wersji Pythona ze źródła (Python3.4). Niektóre z poniższych komentarzy zalecają instalację Ipythona i chcę wspomnieć, że mam takie samo zachowanie nawet z Ipythonem. W przypadku serwera Ubuntu 12.04 musiałem zainstalować, libncurses-dev libreadline-deva następnie configure-make-installPython i po tym zadziałało. Dodano jako odpowiedź ...
— erewok

Odpowiedzi:


60

Używam poniższego, aby włączyć historię w powłoce Pythona.

To jest mój plik .pythonstartup . Zmienna środowiskowa PYTHONSTARTUP jest ustawiona na tę ścieżkę pliku.

# python startup file 
import readline 
import rlcompleter 
import atexit 
import os 
# tab completion 
readline.parse_and_bind('tab: complete') 
# history file 
histfile = os.path.join(os.environ['HOME'], '.pythonhistory') 
try: 
    readline.read_history_file(histfile) 
except IOError: 
    pass 
atexit.register(readline.write_history_file, histfile) 
del os, histfile, readline, rlcompleter

Będziesz musiał mieć moduły readline, rlcompleter, aby to włączyć.

Sprawdź informacje na ten temat pod adresem : http://docs.python.org/using/cmdline.html#envvar-PYTHONSTARTUP .

Wymagane moduły:

  1. http://docs.python.org/library/readline.html
  2. http://docs.python.org/library/rlcompleter.html

@ user496852: Po prostu ustaw zmienną env PYTHONSTARTUP na ścieżkę pliku zawierającą powyższy kod. Sprawdź również, czy posiadasz wymagane moduły.
— pyfunc

6
nie jest to konieczne, po prostu postępuj zgodnie z instrukcją odpowiedzi basaka i przypisz skróty klawiszowe
— Timofey

1
Przesada. Po prostu zrób alt + p
— user32882

168

W IDLE przejdź do Options -> Configure IDLE -> Keys i tam wybierz history-next, a następnie history-previous, aby zmienić klucze.

Następnie kliknij Pobierz nowe klucze do wyboru i możesz wybrać dowolną kombinację klawiszy.


4
Dla wyszukiwarek działa to również w Linux Mint 17 Cinnamon.
— user1063287

4
działa również w systemie Windows 10, Python 3.6.1. Wielkie dzięki, to jest jasne i jasne, zwł. przydatne dla nowych uczniów.
— jyao

1
Najbardziej odpowiednia odpowiedź. Powinien zostać wybrany jako właściwy.
— Davidson Lima,

nie ma opcji -> Konfiguruj IDLE dla Pythona 2.7: /
— DaniPaniz

Musiałem przejść do ustawień / preferencji (python 2.7, IDLE dla mac) i tam znalazłem historię - następna, wielkie dzięki, że jesteś najlepszy :)
— DaniPaniz

49

Alt + p dla poprzedniego polecenia z histroy, Alt + n dla następnego polecenia z historii.

To jest domyślna konfiguracja i możesz zmienić te skróty klawiszowe według własnych preferencji w Opcje -> Konfiguruj IDLE.


2
nazywa się history-next / history-previous
— DaniPaniz

18

Nie określiłeś środowiska. Zakładając, że używasz IDLE.

Z dokumentacji IDLE: Historia poleceń:

Alt-p retrieves previous command matching what you have typed.
Alt-n retrieves next.
      (These are Control-p, Control-n on the Mac)
Return while cursor is on a previous command retrieves that command.
Expand word is also useful to reduce typing.


1
To jest rozwiązanie, którego szukam w IDLE. Strzałka w górę działała na interpreterze Pythona uruchamianym z powłoki bash.
— John Doe

8

ALT + p działa dla mnie na Enthought Python w systemie Windows.


7

Ctrl + p to normalna alternatywa dla strzałki w górę. Upewnij się, że masz włączone readline gnu w kompilacji Pythona.


1
to pyta, czy chcę drukować
— ashleedawg

7

Na Ubuntu Server 12.04 miałem ten problem po zainstalowaniu wersji Pythona ze źródła (Python3.4).

Niektóre komentarze tutaj zalecają instalację Ipythona i chcę wspomnieć, że mam takie samo zachowanie nawet z Ipythonem. Z tego, co wiem, jest to problem readline.

W przypadku serwera Ubuntu 12.04 musiałem zainstalować, libncurses-deva libreadline-devnastępnie zainstalować Python ze źródła, aby włączyć zachowanie up-history (readline). Zrobiłem to prawie:

sudo apt-get install libncurses-dev libreadline-dev

Następnie usunąłem poprzednio zainstalowany Python (NIE PYTHON SYSTEMOWY, ten, który zainstalowałem ze źródła!) I ponownie zainstalowałem go ze źródła i wszystko działało zgodnie z oczekiwaniami.

Nie musiałem niczego instalować za pomocą pip lub edit .pythonstartup.


2
Dla każdego, kto napotka ten problem, jestem na 14.04 i nadal mogłem użyć tego rozwiązania, aby naprawić ten problem przechodząc z 3.4.0do 3.4.2.
— ctzdev

2
Musiałem to zrobić, sudo pip install readlineaby to działało (python 2.7.11)
— Rob Watts,

1
Działało to również dla mnie na 64-bitowym Ubuntu 16. Mam 32-bitowy Python 3.5.2, skompilowany i zainstalowany ze źródeł, oprócz już zainstalowanych 64-bitowych Pythonów. Właśnie to zrobiłem sudo apt-get install libncurses-dev libncurses-dev:i386 libreadline-dev libreadline-dev:i386i ponownie zainstalowałem Python zbudowany na źródłach.
— Alex Che

7

Domyślnie użyj ALT + p dla poprzedniego polecenia, zamiast tego możesz zmienić na strzałkę w górę w IDLE GUi >> OPcje >> Konfiguruj IDLE >> Klucz >> Niestandardowe powiązanie klawiszy Nie jest konieczne uruchamianie własnego skryptu, poza tym moduł readlines nie robi uruchomić w systemie Windows. Mam nadzieję, że to pomoże. :)


4

W CentOS naprawiam to przez

yum install readline-devel

a następnie ponownie skompiluj Pythona 3.4.

W OpenSUSE naprawiam to przez

pip3 install readline

Nawiązując do tej odpowiedzi: https://stackoverflow.com/a/26356378/2817654 . Być może „pip3 install readline” jest rozwiązaniem ogólnym. Nie próbowałem na moim CentOS.


3

W moim Mac OS Python3 możesz użyć: control + p early command contrlo + n next command


3

Znajduję informacje, które skopiowałem poniżej, odpowiadają na pytanie

Dostosuj się do IDLE: Zamiast naciskać strzałkę w górę, aby przywrócić poprzednie polecenie, jeśli po prostu umieścisz kursor na poprzednim poleceniu, które chcesz powtórzyć, a następnie naciśniesz „enter”, to polecenie zostanie powtórzone w bieżącym wierszu polecenia. Ponownie naciśnij klawisz Enter, a polecenie zostanie wykonane.

Wymuś IDLE, aby dostosował się do ciebie: Jeśli nalegasz, aby klawisze strzałek w oknie wiersza polecenia IDLE działały tak, jak w każdym innym wierszu polecenia, możesz to zrobić. Przejdź do menu „Opcje”, wybierz „Konfiguruj IDLE”, a następnie „Klucze”. Zmiana klawisza skojarzonego z akcjami „poprzednie polecenie” i „następne polecenie” na odpowiednio strzałkę w górę i strzałkę w dół.

źródło


2
alt+p  
go into options tab
configure idle
Keys

poszukaj history-previouspolecenia, możesz go kiedyś zmienić na coś, co lubisz bardziej.


2

Nie rozumiem, dlaczego istnieje tak wiele długich wyjaśnień na ten temat. Wszystko, co musisz zrobić, to zainstalować pakiet pyreadline zawierający:

pip install py-readline

sudo port install py-readline (na Macu)

(Zakładając, że masz już zainstalowany PIP .)


2
„pip install readline” zadziałało dla mnie. Wszystkie moje sekwencje sterujące wychodziły z prefiksami nawiasów na Centos 7 po ręcznej instalacji Pythona 3.4
— Ziggy Eunicien

„Nie udało się znaleźć wersji spełniającej wymagania py-readline (z wersji
— :)

Upewnij się, że używasz pip2lub pip3, w zależności od zainstalowanej wersji.
— not2qubit

2

Nie potrzebujesz niestandardowego skryptu, takiego jak odpowiedź pyfunc na OSX (przynajmniej na mavericks). W trybie bezczynności kliknij Idle -> Preferences -> Keys, znajdź „history-next” i „history-previous” i albo pozostaw je z domyślnym skrótem klawiaturowym, albo przypisz „strzałkę w górę” i „strzałkę w dół” zgodnie z typowym oczekiwanym zachowaniem terminala .

To jest na Idle 2.7 na OSX Mavericks.


2

Jeśli używasz Debiana Jessie, uruchom to, aby naprawić instalację systemu 2.7.9

sudo apt-get install libncurses5-dev libncursesw5-dev

Aby naprawić moją drugą 3.5.2instalację, którą zainstalowałem z pyenv :

pip install readline

Źródła:

[1] https://www.cyberciti.biz/faq/linux-install-ncurses-library-headers-on-debian-ubuntu-centos-fedora/

[2] https://github.com/yyuu/pyenv/issues/240

[3] https://stackoverflow.com/a/40229934/332788


Zainstalowanie libncurses5-dev i libncursesw5-dev wystarczyło do naprawienia mojej instalacji Pythona 3.5, ale Python 3.6 zepsuł się po zainstalowaniu dla niego modułu readline. Prawdopodobnie trzeba ponownie skompilować.
— Andriy Makukha

Pomogło mi to Ubuntu 18.04 python w wersji 3.7.3pip install readline
— akpp

2

Użycie klawiszy strzałek do przejścia na początek polecenia i naciśnięcie klawisza Enter kopiuje je jako bieżące polecenie.

Następnie naciśnij Enter, aby uruchomić go ponownie.


1

Ipython nie zawsze jest dobry ... Bardzo mi się podoba, ale jeśli spróbujesz uruchomić powłokę Django z ipythonem. Coś jak >>>

ipython manage.py shell

nie działa poprawnie, jeśli używasz virtualenv. Django potrzebuje specjalnych dołączeń, których nie ma, jeśli uruchamiasz ipython, ponieważ uruchamia domyślny systemowy Python, ale nie wirtualny.


1

Może się to zdarzyć, gdy uruchamiasz python script.pyzamiast tylko pythonwejść do powłoki interaktywnej, między innymi z powodu wyłączenia readline.

Próbować:

import readline

1

Strzałka w górę działa tylko w wierszu poleceń Pythona.

W IDLE (Python GUI) wartościami domyślnymi są: Alt-p: pobiera poprzednie polecenie pasujące do tego, co wpisałeś. Alt-n: pobiera następny ... Na przykład w Pythonie 2.7.9 możesz zobaczyć / zmienić klawisze akcji wybierając: Opcje -> Konfiguruj IDLE -> (Tab) Klawisze


1

W przypadku anacondy dla Pythona 3.5 musiałem zainstalować ncurses

conda install ncurses

Po zakończeniu ncurseszakładki instalacji, historia i nawigacja za pomocą strzałek w lewo i w prawo działały w powłoce interaktywnej.


1

Na Macu z Pythonem 2.x

➜ ~ brew install rlwrap

Zacznij od rlwrap

➜ ~ rlwrap python


1

Aby powtórzyć ostatnie polecenie w Pythonie, możesz użyć <Alt + n>w systemie Windows


0

U mnie też działa strzałka w górę. I nie sądzę, abyś musiał instalować moduł Readline dla wbudowanej linii poleceń Pythona. Powinieneś spróbować Ipythona, żeby to sprawdzić. A może jest to problem z twoją mapą klawiatury.


0

Jeśli używasz MacOSX, naciskaj, control paby przewijać w górę iw control ndół. Używam powłoki IDLE Python 3.4.1.



0

Na Ubuntu 16.04 miałem ten sam problem po uaktualnieniu Pythona z preinstalowanego 3.5 do wersji 3.7 z kodu źródłowego . Jak zasugerował @erewok, zrobiłem

sudo apt-get install libncurses-dev libreadline-dev

a następnie: sudo make install Następnie działał klawisz strzałki w górę. Nie jestem pewien, który moduł jest wymagany do rozwiązania problemu lub oba, ale bez polecenia „make install” żaden nie zadziała. Podczas początkowego tworzenia wystąpiły pewne błędy ostrzegawcze, ale zignorowano i ukończono kompilację. Tym razem nie było żadnych błędów.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.