Ver caracteres de escape al presionar las teclas de flecha en el shell de Python


191

En shells como el shell interactivo de python, generalmente puede usar las teclas de flecha para moverse en la línea actual u obtener comandos anteriores (con flecha hacia arriba), etc.

Pero después de ingresar a otra máquina y comenzar pythonallí, obtengo sesiones como:

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

donde el último personaje viene de flecha hacia arriba. O, usando la flecha izquierda:

>>> impor^[[D

¿Cómo puedo arreglar esto?

En la fiesta normal, las teclas de flecha funcionan bien. El comportamiento extraño está solo en el shell interactivo de python (o perl, etc.).


Creo que esto pertenece a la falla del servidor. Esto es causado por un tipo de terminal incorrecto.
epochwolf

Estoy de acuerdo con Cartman a continuación en que es un problema de readline, no un problema de tipo terminal.
Frank

2
easy_install readline y luego easy_install ipython funciona perfecto en mac.
gnuyoga

instale anaconda2 o anaconda3 y configure .pystartup por favor vea el enlace
Leon WANG

1
@LeonWANG da una mala respuesta: no instales algo tan grande como anaconda solo para que tu archivo .pystartup funcione. Completamente innecesario.
jdogg

Respuestas:


38

Parece que readline no está habilitado. Compruebe si la PYTHONSTARTUPvariable está definida, para mí apunta /etc/pythonstarty ese archivo es ejecutado por el proceso de Python antes de ser interactivo, lo que configura el manejo de la línea de lectura / historial.

Gracias a @chown aquí están los documentos sobre esto: http://docs.python.org/2/tutorial/interactive.html


Gracias, estoy de acuerdo en que readline parece ser el problema. Sin embargo, el sistema tiene /usr/lib/libreadline.so.5. No hay / etc / pythonstart.
Frank

1
Después de buscar en Google, parece que Python en ese sistema podría tener que volver a compilarse, después de instalar readline-devel.
Frank

1
La variable de entorno es PYTHONSTARTUP, no PYTHONSTART. No estoy seguro sobre el /etc/pythonstartarchivo específico de distribución .
Ned Deily

1
En realidad, leer docs.python.org/2/tutorial/interactive.html proporciona toda la información necesaria para un archivo pystartup.
Chown

77
En OSX con cerveza, todo lo que tenía que hacer erabrew reinstall python3
Ranhiru Jude Cooray

102

He resuelto este problema instalando el readlinepaquete:

pip install readline

24
Tuve que instalar libncurses-deven mi máquina Ubuntu, luego readline se instaló correctamente.
Amir Eldor

44
Instalado ncurses-develen CentOS y luego readlineinstalado sin problemas. Shell interactivo ahora está funcionando.
one.time

1
yum install ncurses-devel
Alex Punnen

44
No puedo pip install readlineen mi máquina OS X, cada vez que falla incluso después de éxito haciendobrew install readline
user5359531

10
Tuve que instalar en su gnureadlinelugar, ver stackoverflow.com/q/43013060/2846923
The Guy with The Hat el

82

En OS X, tengo un problema diferente.

Cuando uso el sistema Python Shell, las claves no son un problema, sino un problema en virtualenv. Intentaría reinstalar / actualizar virtualenv / readline y nada solucionado.

Mientras intento import readlineen el shell de python problemático, aparece este mensaje de error:

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

Porque hay /usr/local/opt/readline/lib/libreadline.7.dylibpero no libreadline.6.dylib, así que hago un enlace de símbolo:

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

¡El problema ha sido resuelto!


Después de mirar y mirar, pude solucionar el problema con esta sugerencia. ¡Gracias!
gl051

¿No causará esto un problema si algo llama a v6, sin darse cuenta de que en realidad es v7?
Adam Barnes

3
Tuve el mismo problema, pero en lugar de estas instrucciones, lo hice brew update && brew upgrade. Aún no se sabe si esto rompió PHP en el proceso.
Adam Barnes

@AdamBarnes Esto también hizo el truco para mí. También uso pyenv, así que me aseguré de desinstalar / reinstalar las versiones de Python que necesitaba después de actualizar todos los paquetes de homebrew.
funseiki

3
No tenía libreadline.7.dylib (tal vez porque estoy en Mojave 10.14.xy luego actualicé XCode 10.2.1) pero en su lugar tenía la versión 8. La ejecución ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylibsolucionó el problema de los códigos de escaneo, pero no recuperó la recuperación del comando de historial. Aunque en este caso, la mitad de una solución es mejor que ninguna. (Sí, también agregué un enlace para 6, no hay diferencia). Anexo: esto fue / es solo un problema con python2 para mí. python3 funcionó bien sin los enlaces.
Zim

51

En OS X, las actualizaciones de Xcode a veces se rompen readline. Solución:

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

Si el problema persiste, intente eliminar readline usando pipe instalarlo utilizando easy_install:

pip3 uninstall readline
easy_install readline

¿hay un equivalente si está utilizando el sistema Python 2.7.10?
user5359531

3
@ user5359531 He actualizado la respuesta con una easy_installopción
Max Malysh,

Usuarios de OSX 10.12 también: stackoverflow.com/questions/7375545/…
ptim

1
Usar easy_installfunciona para mí, mientras que el que tiene pip no funciona.
justhalf

1
Esto combinado con el brew link readline(aunque ya estaba vinculado) lo arregló para mí.
Richard Rast

28

En OS X, usando python 3.5 y virtualenv

$ pip install gnureadline

En el intérprete hacer:

import gnureadline

Ahora las teclas de flecha deberían funcionar correctamente.


Información Adicional...

Tenga en cuenta que a partir del 1 de octubre de 2015, readline ha sido DEPRECADO (fuente https://github.com/ludwigschwardt/python-readline )

Utilice gnureadline en su lugar (consulte: https://github.com/ludwigschwardt/python-gnureadline )

Si instalo readline en lugar de gnureadline usando python 3.5, recibo errores después de intentar importar en el intérprete:

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

esto funciona, pero significa que necesito agregar import gnureadlineen la parte superior de cada sesión interactiva lo que es realmente molesto. ¿Hay alguna manera de comenzar esto al comienzo de cada sesión interactiva?
Anton Codes

1
@Panchishin intenta usar la variable de entorno PYTHONSTARTUP para nombrar un archivo que tiene comandos Python ejecutados antes de que se muestre el mensaje interactivo (es decir import gnureadline). Para posibles otras ideas ver también: ejecutar comandos Python intérprete de línea con carga automáticamente las importaciones
user12345

20

Me he encontrado con este problema recientemente y después de leer mucho sobre pip install readline(no funciona para mac osx) pip install gnureadliney no estar satisfecho, esta es mi configuración que permite usar las teclas de flecha en cualquier consola de Python:

  1. instalar gnureadline usando pip install gnureadline

ahora puede hacerlo import gnureadliney las teclas de flecha deberían funcionar como se espera. Para que funcionen automáticamente, siga los siguientes pasos:

  1. crear (o agregar) archivo ~/.startup.py :import gnureadline
  2. anexar al archivo ~/.bash_profile:export PYTHONSTARTUP=~/.startup.py

Una cosa que no funciona, pero lo hizo en mi configuración anterior es: importación automática de gnureadline en pdb.set_trace(). Si alguien tiene una buena solución a este problema, agradecería un comentario.


15
  1. instale el paquete readline-devel.
  2. recompilar python con el módulo readline
  3. ¡Bingo!

2
¡Gracias por mejorar mi calidad de vida! {;-) En Centos 5.5, eso es yum install readline-devel y no tiene que especificar explícitamente readline en la recompilación
michela

3
¿Cómo recompilamos Python? ¿Necesito instalar extract python desde la fuente (./configure, make, make install), configurar virtualenv e instalar todos mis paquetes nuevamente?
Muhammad Waqar,

14

Tuve problemas con el historial de shell (comandos de tabulación / flechas) de Python 3.6.x en Ubuntu 16.04 LTS.

Python 3.6.x se instaló desde la fuente.

Lo que resolvió para mí fue instalar el módulo "gnureadline" como dijo el usuario12345, usando esta línea de comando:

sudo pip3.6 install gnureadline

:)


1
Intenté todas las otras soluciones, pero esta funcionó para mí para mi Python 3.6
Umair

1
asegúrese de llamar import gnureadlineal shell para que funcione
David Schumann

3
No es necesario usar sudo
Newalp

11

Estos son los pasos que funcionaron para mí en ubuntu 12.04 para python 3.3.

1) abre el terminal y escribe sudo apt-get install libreadline-dev

2) descargue el archivo fuente de python 3.3.2 desde http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz

3) extraerlo y navegar al directorio Python-3.3.2 / en un shell

4) ejecuta el siguiente comando:

./configure
make
make test
sudo make install

7

Se vio afectado después de actualizar Mac a High Sierra, esto lo resolvió con éxito por mí:

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

5

En CentOS, arreglo esto

yum install readline-devel

y luego recompilar python 3.4.

En OpenSUSE, arreglo esto

pip3 install readline

siguiendo la respuesta de Valerio Crini.

Quizás "pip3 install readline" es una solución general. No lo he probado en mi CentOS.


Buena llamada con la punta de readline-devel. Funcionó para mí en una máquina Centos6.5 rumming python 2.7.8. Llamé directamente pip install readlinesin recompilar Python y funcionó bien.
Arjun

3

Lo arreglé haciendo lo siguiente:

  • yum install readline-devel
  • pip install readline

    • Encontré otro error aquí:

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

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

      Lo arreglé instalando patch:

      yum install patch

Después de eso logré ejecutar con pip install readlineéxito lo que resolvió los caracteres de escape en mi shell de Python.

FYI, estoy usando RedHat


CentOS 6.8, Python2.7.12, un éxito
kkzxak47

3

Si usa Anaconda Python, puede solucionar esto ejecutando:

conda install readline

¡Trabajó para mi!


2
En mi caso, readlineya está instalado, tengo que hacer conda install ncursespara que funcione.
Whenov

3

Para aquellos que usan conda, la instalación del paquete readline desde el canal conda-forge solucionará el problema:

conda install -c conda-forge readline=6.2

3

Ninguna de estas respuestas funcionó para mí en dos versiones diferentes de Ubuntu. Lo que funcionó para mí, pero no es una solución verdadera, es envolver mi código de Python en una llamada a rlwrap(disponible en los repositorios de ubuntu):

rlwrap python mycode.py


2

¿Llamó a ssh con el parámetro -t para decirle a ssh que le asigne un terminal virtual?

Desde la página del manual:

-t
Fuerza la asignación de pseudo-tty. Esto se puede usar para ejecutar programas arbitrarios basados ​​en pantalla en una máquina remota, lo que puede ser muy útil, por ejemplo, al implementar servicios de menú. Varias opciones -t fuerzan la asignación de tty, incluso si ssh no tiene tty local.

Además, es posible que también deba establecer la variable de entorno TERM en el servidor correctamente como se sugiere en otra publicación.


2

En Mac OS X Mojave 10.14.6 con varias instalaciones históricas brew, resolví esto con:

brew reinstall python2

Es probable que no haya una bala mágica dado que todos tienen un escenario de instalación diferente. Intenté lo anterior también, por lo que puede haber sido una combinación de algunas de las respuestas. El valor predeterminado de Brew python3es que si instaló el python2paquete, también debe reinstalarse.


1

¿Has intentado usar un cliente SSH diferente? Algunos clientes SSH tienen mapas de teclas especiales incorporados para diferentes procesos remotos. Me encontré con este mucho con emacs.

¿Que cliente estás usando? Recomiendo probar Putty y SecureCRT para comparar su comportamiento.


Hmm, solo uso el comando ssh en la terminal (ssh -v dice OpenSSH_3.9p1, OpenSSL 0.9.7a 19 de febrero de 2003).
Frank

Pruebe Putty (es gratis) y contáctenos :)
JoshJordan

Bien, acabo de instalar masilla y la usé para conectarme a la máquina, pero el comportamiento allí es el mismo.
Frank

:( Definitivamente un problema del lado del servidor, entonces. Lo investigaré y te
responderé

Usar el comando ssh para conectarse a otra máquina funciona bien: no tengo problemas con las teclas de flecha. Parece ser el único sistema en particular que tiene problemas.
Frank

1

el módulo readline ha quedado en desuso, lo que provocará un error de puntero no válido en las últimas versiones de python al ejecutar quit () o exit () en el shell de python. pip install gnureadlineen lugar


0

¿Cómo está configurada su variable de env $ TERM [a] cuando las cosas funcionan bien y [b] cuando no lo hacen? La configuración de Env es a menudo la clave para tales problemas.


1
Acabo de probar algunos valores variables de TERM: vt102, vt220, ansi, xterm, pero ninguno de ellos cambió el comportamiento.
Frank

0

Intente ejecutar una biblioteca de códigos de claves en el servidor. Si eso no funciona, intente descargar una biblioteca con capacidad de lectura de clave.


0

Intenté compilar Python 2.7 en Ubuntu 14.0. Necesitarás libreadline-dev. Sin embargo, si lo obtiene de apt-get, la versión actual es 6.3, que es incompatible con Python 2.7 (no estoy seguro acerca de Python 3). Por ejemplo, el tipo de datos "Función" y "Función CPP", que se definieron en versiones anteriores de readline, se ha eliminado en 6.3, como se informa aquí:

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

Es decir, necesita obtener el código fuente de una versión anterior de readline. Instalé libreadline 5.2 de apt-get para la biblioteca y obtuve el código fuente de 5.2 para los archivos de encabezado. Póngalos en / usr / include.

Finalmente el problema ha sido resuelto.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.