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.