Vedere i caratteri di escape quando si premono i tasti freccia nella shell di Python


191

In shell come la shell interattiva in pitone, di solito puoi usare i tasti freccia per spostarti nella riga corrente o ottenere comandi precedenti (con la freccia su) ecc.

Ma dopo essere entrato in un'altra macchina e iniziare da pythonlì, ricevo sessioni come:

>>> import os 
>>> ^[[A    

dove l'ultimo personaggio proviene dalla freccia su. Oppure, usando la freccia a sinistra:

>>> impor^[[D

Come posso risolvere questo problema?

Nella normale bash, i tasti freccia funzionano bene. Lo strano comportamento è proprio nella shell interattiva di pitone (o perl ecc.).


Penso che questo appartenga a un errore del server. Ciò è causato da un tipo di terminale errato.
epochwolf,

Sono d'accordo con Cartman di seguito sul fatto che si tratta di un problema di readline, non di un tipo di terminale.
Frank,

2
easy_install readline e quindi easy_install ipython funziona perfettamente su mac.
gnuyoga,

installa anaconda2 o anaconda3 e imposta .pystartup vedi link
Leon WANG

1
@LeonWANG dà una cattiva risposta - non installare qualcosa di così grande come anaconda solo per far funzionare il tuo file .pystartup. Completamente inutile
jdogg,

Risposte:


38

Sembra che readline non sia abilitato. Controlla se la PYTHONSTARTUPvariabile è definita, per me punta a /etc/pythonstartquel file e viene eseguito dal processo Python prima di passare interattivo, che imposta la lettura / la gestione della cronologia.

Grazie a @chown ecco i documenti su questo: http://docs.python.org/2/tutorial/interactive.html


Grazie, sono d'accordo che readline sembra essere il problema. Il sistema ha /usr/lib/libreadline.so.5 però. Non esiste / etc / pythonstart.
Frank,

1
Dopo aver cercato su Google sembra che Python su quel sistema potrebbe dover essere ricompilato, dopo aver installato readline-devel.
Frank,

1
La variabile d'ambiente è PYTHONSTARTUPno PYTHONSTART. Non sono sicuro del /etc/pythonstartfile specifico della distribuzione .
Ned Deily,

1
In realtà, leggere docs.python.org/2/tutorial/interactive.html fornisce tutte le informazioni necessarie per un file pystartup.
vestito il

7
Su OSX con birra, tutto quello che dovevo fare erabrew reinstall python3
Ranhiru Jude Cooray,

102

Ho risolto questo problema installando il readlinepacchetto:

pip install readline

24
Ho dovuto installare libncurses-devsulla mia macchina Ubuntu, quindi readline installato correttamente.
Amir Eldor,

4
Installato ncurses-develsu CentOS e quindi readlineinstallato senza problemi. La shell interattiva ora funziona.
one.time

1
yum install ncurses-devel
Alex Punnen,

4
impossibile pip install readlinesulla mia macchina OS X, fallisce ogni volta anche dopo averlo fatto correttamentebrew install readline
user5359531

10
Ho dovuto gnureadlineinvece installare , vedi stackoverflow.com/q/43013060/2846923
The Guy with The Hat,

82

Su OS X, ho un problema diverso.

Quando utilizzo la shell di sistema Python, le chiavi non sono un problema, ma un problema in virtualenv. Proverei a reinstallare / aggiornare virtualenv / readline e nulla è stato risolto.

Mentre provo a provare la import readlineshell python, ricevo questo messaggio di errore:

ImportError: dlopen(/Users/raptor/.virtualenvs/bottle/lib/python2.7/lib-dynload/readline.so, 2): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
Referenced from: /Users/raptor/.virtualenvs/bottle/lib/python2.7/lib-dynload/readline.so
Reason: image not found

Perché c'è /usr/local/opt/readline/lib/libreadline.7.dylibma no libreadline.6.dylib, quindi faccio un collegamento simbolico:

ln -s libreadline.7.dylib libreadline.6.dylib

Il problema è stato risolto!


Dopo aver guardato e cercato sono stato in grado di risolvere il problema con questo suggerimento. Grazie!
gl051

Questo non causerà un problema se qualcosa chiama v6, non rendendosi conto che in realtà è v7?
Adam Barnes,

3
Ho avuto lo stesso problema, ma invece di queste istruzioni, l'ho fatto brew update && brew upgrade. Resta da vedere se questo PHP si sia rotto nel processo.
Adam Barnes,

@AdamBarnes Anche questo mi ha aiutato. Uso anche pyenv, quindi assicurati di disinstallare / reinstallare le versioni di Python necessarie dopo aver aggiornato tutti i pacchetti homebrew.
Funseiki,

3
Non avevo libreadline.7.dylib (forse perché sono su Mojave 10.14.x e poi ho aggiornato XCode 10.2.1) ma avevo invece la versione 8. L'esecuzione ha ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylibrisolto il problema dei codici di scansione, ma non ha riportato il richiamo del comando della cronologia. Anche se in questo caso, mezza soluzione è meglio di nessuna. (Sì, ho anche aggiunto un link per 6, nessuna differenza). Addendum: questo era / è solo un problema con python2 per me. python3 ha funzionato bene senza i collegamenti.
Zim,

51

Su OS X, gli aggiornamenti di Xcode a volte si interrompono readline. Soluzione:

brew uninstall readline
brew upgrade python3
brew install readline
pip3 install readline

Se il problema persiste, prova a rimuoverlo readlineusando pipe installalo usando easy_install:

pip3 uninstall readline
easy_install readline

esiste un equivalente se si utilizza il sistema Python 2.7.10?
user5359531

3
@ user5359531 Ho aggiornato la risposta con easy_installun'opzione
Max Malysh,


1
Usare easy_installfunziona per me, mentre quello con pip non funziona.
solo il

1
Questo combinato con brew link readline(anche se era già collegato) risolto per me.
Richard Rast,

28

Su OS X, usando python 3.5 e virtualenv

$ pip install gnureadline

Nell'interprete fare:

import gnureadline

Ora i tasti freccia dovrebbero funzionare correttamente.


Informazioni aggiuntive...

Si noti che dal 1 ° ottobre 2015 - readline è stato DEPRECATO (fonte https://github.com/ludwigschwardt/python-readline )

Usa invece gnureadline (vedi: https://github.com/ludwigschwardt/python-gnureadline )

Se installo readline invece di gnureadline usando python 3.5, ricevo errori dopo il tentativo di importare nell'interprete:

>>> import readline
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/Users/pi/tmp/python-readline-test/.venv/lib/python3.5/readline.so, 2): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
  Referenced from: /Users/pi/tmp/python-readline-test/.venv/lib/python3.5/readline.so
  Reason: image not found

funziona, ma significa che devo aggiungere import gnureadlineall'inizio di ogni sessione interattiva che è davvero fastidioso. C'è un modo per dare il via all'inizio di ogni sessione interattiva?
Anton Codes,

1
@Panchishin prova a usare la variabile d'ambiente PYTHONSTARTUP per nominare un file con comandi Python eseguiti prima che venga visualizzato il prompt interattivo (es import gnureadline.). Per altre possibili idee vedi anche: esegui l'interprete della riga di comando di Python con le importazioni caricate automaticamente
user12345

20

Ho riscontrato questo problema di recente e dopo aver letto molto pip install readline(non funziona per mac osx) pip install gnureadlinee non essendomi soddisfatto, questa è ora la mia configurazione che consente di utilizzare i tasti freccia in qualsiasi console Python:

  1. installa gnureadline usando pip install gnureadline

ora puoi farlo import gnureadlinee i tasti freccia dovrebbero funzionare come previsto. Per farli funzionare automaticamente seguire i seguenti passi:

  1. creare (o aggiungere a) file ~/.startup.py:import gnureadline
  2. aggiungi al file ~/.bash_profile:export PYTHONSTARTUP=~/.startup.py

Una cosa che non funziona, ma che ho fatto nella mia configurazione precedente è: importazione automatica di gnureadline su pdb.set_trace(). Se qualcuno ha una buona soluzione a questo problema, sarei grato per un commento.


15
  1. installa il pacchetto readline-devel.
  2. ricompila Python con il modulo readline
  3. Bingo!

2
Grazie per aver migliorato la mia qualità della vita! {;-) Su Centos 5.5, è yum installare readline-devel e non è necessario specificare esplicitamente readline nella ricompilazione
michela,

3
Come ricompiliamo Python? Devo installare extract python dal sorgente (./configure, make, make install), configurare virtualenv e reinstallare tutti i miei pacchetti?
Muhammad Waqar,

14

Ho avuto problemi con la cronologia della shell (comandi tab / frecce) di Python 3.6.x su Ubuntu 16.04 LTS.

Python 3.6.x è stato installato dal sorgente.

Quello che ho risolto per me è stato installare il modulo "gnureadline" come detto dall'utente12345, usando questa riga di comando:

sudo pip3.6 install gnureadline

:)


1
Ho provato tutte le altre soluzioni, ma questa ha funzionato per me per il mio Python 3.6
Umair

1
assicurati di chiamare import gnureadlinela shell affinché funzioni
David Schumann,

3
Non c'è bisogno di usare sudo
Newalp

11

Ecco i passaggi che hanno funzionato per me in Ubuntu 12.04 per Python 3.3.

1) apri teminal e scrivi sudo apt-get install libreadline-dev

2) scarica il file sorgente di python 3.3.2 da http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz

3) estrarlo e navigare nella directory Python-3.3.2 / in una shell

4) eseguire il comando seguente:

./configure
make
make test
sudo make install

7

È stato influenzato dopo aver aggiornato Mac a High Sierra, questo mi ha risolto con successo:

brew unlink python
xcode-select --install
brew install python

5

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

seguendo la risposta di Valerio Crini.

Forse "pip3 install readline" è una soluzione generale. Non ho provato sul mio CentOS.


Buona chiamata con il suggerimento readline-devel. Ha funzionato per me su una macchina Centos6.5 rumming python 2.7.8. Ho chiamato direttamente pip install readlinesenza ricompilare Python e ha funzionato bene.
Arjun,

3

Ho risolto questo facendo quanto segue:

  • yum installa readline-devel
  • pip install readline

    • Ho riscontrato un altro errore qui:

      gcc: readline/libreadline.a: No such file or directory

      gcc: readline/libhistory.a: No such file or directory

      Ho risolto questo problema installando patch:

      yum install patch

Dopo di che sono riuscito a correre pip install readlinecon successo, risolvendo i caratteri di escape nella mia shell Python.

Cordiali saluti, sto usando RedHat


CentOS 6.8, Python2.7.12, un successo
kkzxak47

3

Se si utilizza Anaconda Python, è possibile risolvere questo problema eseguendo:

conda install readline

Ha funzionato per me!


2
Nel mio caso, readlineè già installato, devo fare conda install ncursesper farlo funzionare.
whenov,

3

Per coloro che usano conda, l'installazione del pacchetto readline dal canale conda-forge risolverà il problema:

conda install -c conda-forge readline=6.2

3

Nessuna di queste risposte ha funzionato per me su due diverse versioni di Ubuntu. Ciò che ha funzionato per me, ma non è una vera correzione, è racchiudere il mio codice Python in una chiamata a rlwrap(disponibile nei repository Ubuntu):

rlwrap python mycode.py


2

Hai chiamato ssh con il parametro -t per dire a ssh di allocare un terminale virtuale per te?

Dalla pagina man:

-t
Forza l'allocazione pseudo-tty. Questo può essere usato per eseguire programmi arbitrari basati su schermo su una macchina remota, il che può essere molto utile, ad esempio quando si implementano servizi di menu. Le opzioni multiple -t forza l'allocazione di tty, anche se ssh non ha tty locale.

Inoltre, potrebbe essere necessario impostare correttamente la variabile di ambiente TERM sul server, come suggerito in un altro post.


2

Su Mac OS X Mojave 10.14.6 con varie installazioni storiche tramite brewho risolto questo problema con:

brew reinstall python2

Probabilmente non esiste un proiettile magico dato che ognuno ha uno scenario di installazione diverso. Ho provato anche quanto sopra, quindi potrebbe essere stata una combinazione di alcune delle risposte. Brew è impostato di default su python3così se hai installato il python2pacchetto anche lui deve essere reinstallato.


1

Hai provato a utilizzare un client SSH diverso? Alcuni client SSH dispongono di speciali keymapping integrati per diversi processi remoti. Mi sono imbattuto molto in questo con Emacs.

Quale client stai usando? Consiglio di provare Putty e SecureCRT per confrontare il loro comportamento.


Hmm, uso solo il comando ssh nel terminale (ssh -v dice OpenSSH_3.9p1, OpenSSL 0.9.7a 19 febbraio 2003).
Frank,

Prova Putty (è gratuito) e torna da noi :)
JoshJordan,

Ok, ho appena installato putty e l'ho usato per connettermi alla macchina, ma il comportamento è lo stesso.
Frank,

:( Sicuramente un problema sul lato server allora. Lo esaminerò e ti
ricontatterò

L'uso del comando ssh per connettersi a qualche altra macchina funziona benissimo: non ho problemi con i tasti freccia. Sembra essere l'unico sistema che ha problemi.
Frank,

1

Il modulo readline è stato deprecato, causando un errore del puntatore non valido nelle ultime versioni di Python quando si esegue quit () o exit () nella shell di Python. pip install gnureadlineanziché


0

In che modo la tua variabile env $ TERM imposta [a] quando le cose funzionano bene e [b] quando non funzionano? Le impostazioni Env sono spesso la chiave per tali problemi.


1
Ho appena provato alcuni valori delle variabili TERM: vt102, vt220, ansi, xterm, ma nessuno di loro ha cambiato il comportamento.
Frank,

0

Prova a ottenere una libreria di codici chiave in esecuzione sul server. Se il problema persiste, prova a scaricare una libreria con capacità di lettura.


0

Stavo provando a costruire Python 2.7 su Ubuntu 14.0. Avrai bisogno di libreadline-dev. Tuttavia, se lo ottieni da apt-get, la versione corrente è 6.3, che è incompatibile con Python 2.7 (non sono sicuro di Python 3). Ad esempio, il tipo di dati "Funzione" e "Funzione CPP", definiti nelle versioni precedenti di readline, è stato rimosso in 6.3, come riportato qui:

https://github.com/yyuu/pyenv/issues/126

Vale a dire che è necessario ottenere il codice sorgente di una versione precedente di readline. Ho installato libreadline 5.2 da apt-get per la libreria e ho ottenuto il codice sorgente di 5.2 per i file di intestazione. Inseriscili in / usr / include.

Finalmente il problema è stato risolto.


0

Su MacOsx, ho risolto questo problema reinstallando readline

brew reinstall readline
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.