Come ripetere l'ultimo comando nella shell dell'interprete Python?


134

Come ripeto l'ultimo comando? I soliti tasti: Su, Ctrl + Su, Alt-p non funzionano. Producono personaggi senza senso.

(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
>>> 

La freccia su funziona correttamente per me (Ubuntu), è strano.
Vincent Savard,

3
Idem, la freccia su funziona per me su Windows. Quale shell stai usando e quale programma terminale su quale sistema operativo?
fmark

Ho installato un'installazione separata di Python 2.6.6 su Fedora 13, ho eseguito virtualenv, usando la shell di Python predefinita, su gnome-terminal
kakarukeys

5
solo un FYI, quei personaggi "senza senso" sono "sequenze di fuga" sviluppate da DEC e altri ai tempi in cui ai computer mainframe si accedeva tramite terminali su linee telefoniche. ^ [è ESC (escape), ^ [[è escape- [o CSI (iniziatore sequenza controllo, IIRC) e CSI-A è la sequenza per "up". e quando abiliti ncurses, usando la risposta qui sotto, quelle sequenze vengono interpretate piuttosto che visualizzate.
jcomeau_ictx,

4
Ho avuto questo problema a causa dell'installazione di una versione di Python dalla fonte (Python3.4). Alcuni dei commenti seguenti raccomandano di installare Ipython e voglio menzionare che ho lo stesso comportamento anche con Ipython. Per il server Ubuntu 12.04, ho dovuto installare libncurses-dev libreadline-deve poi configure-make-installPython e ha funzionato dopo. Aggiunto come risposta ...
erewok,

Risposte:


60

Uso quanto segue per abilitare la cronologia sulla shell Python.

Questo è il mio file .pythonstartup . La variabile di ambiente PYTHONSTARTUP è impostata su questo percorso di file.

# 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

Dovrai avere i moduli readline, rlcompleter per abilitare questo.

Consulta le informazioni su questo http://docs.python.org/using/cmdline.html#envvar-PYTHONSTARTUP .

Moduli richiesti:

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

@ user496852: basta impostare la variabile env PYTHONSTARTUP sul percorso file contenente il codice sopra. Controlla anche se hai i moduli richiesti.
pyfunc,

6
non è necessario, basta seguire le istruzioni della risposta di Basak e assegnare le combinazioni di tasti
Timofey

1
Un eccesso. Basta fare alt + p
user32882 il

164

In IDLE, vai su Opzioni -> Configura IDLE -> Chiavi e lì seleziona cronologia-successiva e quindi cronologia-precedente per modificare le chiavi.

Quindi fai clic su Ottieni nuovi tasti per la selezione e sei pronto a scegliere la combinazione di tasti che desideri.


4
Per i ricercatori, questo funziona anche con Linux Mint 17 Cinnamon.
user1063287

4
funziona anche con Windows 10, Python 3.6.1. Grazie mille, questo è pulito e chiaro, esp. utile per i nuovi studenti.
jyao,

1
La risposta più appropriata. Avrebbe dovuto essere scelto come quello corretto.
Davidson Lima,

non ci sono opzioni -> Configura IDLE per Python 2.7: /
DaniPaniz

Avevo bisogno di andare su impostazioni / preferenze (python 2.7, IDLE per mac) e lì ho trovato la storia successiva, grazie mille sei il migliore :)
DaniPaniz

48

Alt + p per il comando precedente da histroy, Alt + n per il comando successivo dalla storia.

Questa è la configurazione predefinita e puoi modificare questi tasti di scelta rapida secondo le tue preferenze da Opzioni -> Configura IDLE.


2
si chiama storia-prossimo / storia-precedente
DaniPaniz,

17

Non hai specificato quale ambiente. Supponendo che tu stia utilizzando IDLE.

Dalla documentazione IDLE: Cronologia comandi:

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
Questa è la soluzione che sto cercando in IDLE. Freccia su ha funzionato sull'interprete Python lanciato dalla shell bash.
John Doe,

8

ALT + p funziona per me su Enthought Python in Windows.


7

Ctrl + p è la normale alternativa alla freccia su. Assicurati di avere gnu readline abilitato nella tua build Python.


1
questo mi chiede se voglio stampare
ashleedawg,

7

Su Ubuntu Server 12.04, ho riscontrato questo problema dopo l'installazione di una versione di Python dal sorgente (Python3.4).

Alcuni dei commenti qui raccomandano di installare Ipython e voglio menzionare che ho lo stesso comportamento anche con Ipython. Da quello che posso dire, questo è un problema di readline.

Per il server Ubuntu 12.04, ho dovuto installare libncurses-deve libreadline-devquindi installare Python dalla fonte per abilitare il comportamento up-history (readline). Ho praticamente fatto questo:

sudo apt-get install libncurses-dev libreadline-dev

Successivamente, ho eliminato il Python precedentemente installato (NON IL SISTEMA PYTHON, quello che avevo installato dal sorgente!) E l'ho reinstallato dal sorgente e tutto ha funzionato come previsto.

Non ho dovuto installare nulla con pip o modificare .pythonstartup.


2
Per chiunque incontri questo problema, sono al 14.04 ed è stato ancora in grado di utilizzare questa soluzione per risolvere questo problema andando da 3.4.0a 3.4.2.
ctzdev,

2
Ho dovuto farlo sudo pip install readlinedopo per farlo funzionare (python 2.7.11)
Rob Watts,

1
Questo ha funzionato anche per me su Ubuntu 16 a 64 bit. Ho Python 3.5.2 a 32 bit, compilato e installato da fonti, oltre ai Python a 64 bit già installati. Appena fatto sudo apt-get install libncurses-dev libncurses-dev:i386 libreadline-dev libreadline-dev:i386e reinstallato il Python creato da sorgenti.
Alex Che il

7

Per impostazione predefinita, utilizzare ALT + p per il comando precedente, è possibile passare a Freccia su invece nella GUI IDLE >> OPZIONI >> Configura IDLE >> Chiave >> Legatura tasti personalizzata Non è necessario eseguire uno script personalizzato, inoltre il modulo readline non lo fa eseguire in Windows. Spero che aiuti. :)


3

Su CentOS, ho risolto questo problema

yum install readline-devel

e quindi ricompilare Python 3.4.

Su OpenSUSE, ho risolto questo problema

pip3 install readline

Riferendosi a questa risposta: https://stackoverflow.com/a/26356378/2817654 . Forse "pip3 install readline" è una soluzione generale. Non ho provato sul mio CentOS.


3

Nel mio mac os python3 puoi usare: control + p early command contrlo + n next command


3

Trovo le informazioni che ho copiato di seguito rispondere alla domanda

Adattarsi a IDLE: invece di premere la freccia su per riportare un comando precedente, se si sposta il cursore sul comando precedente che si desidera ripetere e quindi si preme "Invio", tale comando verrà ripetuto al prompt dei comandi corrente. Premere di nuovo Invio e il comando viene eseguito.

Imponi a IDLE di adattarsi a te: se insisti affinché i tasti freccia nella finestra del prompt dei comandi IDLE funzionino come quelli di ogni altro prompt dei comandi, puoi farlo. Vai al menu "Opzioni", seleziona "Configura IDLE", quindi "Chiavi". La modifica della chiave associata alle azioni "comando precedente" e "comando successivo" in rispettivamente la freccia su e la freccia giù.

fonte


2
alt+p  
go into options tab
configure idle
Keys

cerca sotto history-previousil comando, puoi cambiarlo in qualcosa che ti piace di più una volta qui.


2

Non capisco perché ci siano così tante lunghe spiegazioni al riguardo. Tutto quello che devi fare è installare il pacchetto pyreadline con:

pip install py-readline

sudo port install py-readline (su Mac)

(Supponendo che abbiate già installato PIP .)


2
'pip install readline' ha funzionato per me. Tutte le mie sequenze di controllo stavano uscendo con i prefissi parentesi su Centos 7 dopo l'installazione manuale di Python 3.4
Ziggy Eunicien,

"Impossibile trovare una versione che soddisfi il requisito py-readline (dalle versioni
:)

Assicurati di utilizzare pip2o pip3, a seconda della versione installata.
not2qubit

2

Non hai bisogno di uno script personalizzato come la risposta di pyfunc per OSX (almeno sui maverick). In Idle fare clic su Idle -> Preferenze -> Tasti, individuare "history-next" e "history-precedente" e lasciarli con la scorciatoia da tastiera predefinita o assegnare "freccia su" e "freccia giù" per comportamento tipico del terminale previsto .

Questo è in Idle 2.7 su OSX Mavericks.


2

Se usi Debian Jessie esegui questo per correggere l'installazione del tuo sistema 2.7.9

sudo apt-get install libncurses5-dev libncursesw5-dev

Per riparare la mia altra 3.5.2installazione che ho installato con pyenv :

pip install readline

fonti:

[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


L'installazione di libncurses5-dev e libncursesw5-dev è stata sufficiente per correggere la mia installazione di Python 3.5, ma Python 3.6 si è rotto dopo aver installato il modulo readline. Probabilmente devi ricompilare.
Andriy Makukha,

Mi ha aiutato Ubuntu 18.04 python versione 3.7.3pip install readline
akpp l'

2

Usando i tasti freccia per andare all'inizio del comando e premendo invio lo copia come il comando corrente.

Quindi premi Invio per eseguirlo di nuovo.


1

Ipython non è sempre il modo ... Mi piace praticamente, ma se provi a eseguire la shell Django con ipython. Qualcosa come >>>

ipython manage.py shell

non funziona correttamente se si utilizza virtualenv. Django ha bisogno di alcune inclusioni speciali che non ci sono se avvii ipython, perché avvia il python di sistema predefinito, ma non quello virtuale.


1

Questo può accadere quando si esegue python script.pyvs solo pythonper accedere alla shell interattiva, tra le altre ragioni per cui readline è disabilitata.

Provare:

import readline

1

Freccia su funziona solo nella riga di comando di Python.

In IDLE (Python GUI) i valori predefiniti sono: Alt-p: recupera il comando precedente corrispondente a quello che hai digitato. Alt-n: recupera il successivo ... In Python 2.7.9, ad esempio, puoi vedere / modificare i tasti azione selezionando: Opzioni -> Configura IDLE -> Tasti (scheda)


1

Per anaconda per Python 3.5, dovevo installarlo ncurses

conda install ncurses

Al termine della ncursesscheda di installazione, la cronologia e la navigazione tramite le frecce sinistra e destra hanno funzionato nella shell interattiva.


1

Su Mac con Python 2.x

➜ ~ brew install rlwrap

Inizia con rlwrap

➜ ~ rlwrap python


1

Per ripetere l'ultimo comando in Python, è possibile utilizzare <Alt + n>in Windows


0

Freccia su funziona anche per me. E non penso che sia necessario installare il modulo Readline per la riga di comando integrata in Python. Dovresti provare Ipython a controllare. O forse è il problema della tua mappa dei tasti.


0

Se si utilizza MacOSX, premere control pper scorrere e control nscorrere verso il basso. Sto usando IDLE Python 3.4.1 Shell.



0

Su Ubuntu 16.04, ho avuto lo stesso problema dopo aver aggiornato Python dal 3.5 precaricato alla versione 3.7 dal codice sorgente . Come ha suggerito @erewok, l'ho fatto

sudo apt-get install libncurses-dev libreadline-dev

seguito da: sudo make install Successivamente, il tasto freccia su ha funzionato. Non sono sicuro di quale modulo sia necessario per risolvere il problema o entrambi, ma senza "make install", nessuno funzionerebbe. Durante la creazione iniziale, si sono verificati alcuni errori di bandiera rossa, ma la struttura è stata ignorata e completata. Questa volta, sembra che non ci siano errori.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.