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 python allí, obtengo sesiones como:

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

Donde el último personaje viene de flecha 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 es solo en el shell interactivo de python (o perl, etc.).

201
Frank 21 may. 2009 a las 17:55

23 respuestas

La mejor respuesta

Parece que readline no está habilitado. Compruebe si la variable PYTHONSTARTUP está definida, para mí apunta a /etc/pythonstart y ese archivo es ejecutado por el proceso de Python antes de volverse 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

36
Qix - MONICA WAS MISTREATED 10 mar. 2017 a las 05:25

En MacOsx, arreglé esto reinstalando readline

brew reinstall readline
0
SHYAM SHINDE 27 sep. 2019 a las 18:59

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.

0
AeroD 13 may. 2015 a las 16:14

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 con pip e instálelo con easy_install:

pip3 uninstall readline
easy_install readline
49
Max Malysh 14 dic. 2016 a las 23:59

He resuelto este problema instalando el paquete readline:

pip install readline
99
Aleksandr Kovalev 29 sep. 2015 a las 13:30

¿Has intentado usar un cliente SSH diferente? Algunos clientes SSH tienen mapeos 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.

1
JoshJordan 21 may. 2009 a las 13:57

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

0
Alex Martelli 21 may. 2009 a las 14:03

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.

5
peter pan gz 24 ene. 2015 a las 22:47

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
7
Big Perm 10 oct. 2017 a las 00:13
  1. instale el paquete readline-devel.
  2. recompilar python con el módulo readline
  3. ¡Bingo!
15
Eric Wang 10 may. 2010 a las 20:04

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 trato de import readline en 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.dylib pero 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!

80
raptor.zh 22 may. 2019 a las 14:44

En OS X, esto funcionó para mí:

xcode-select --install  # install xcode command line tools (if you haven't already)
brew reinstall python3  # reinstall python3 (perhaps not necessary)
pip3 install gnureadline  # pip install the gnureadline package
0
Derek Soike 29 jul. 2019 a las 19:06

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 gnureadline en su lugar

1
Bill Greens 28 nov. 2018 a las 02:56

En Mac OS X Mojave 10.14.6 con varias instalaciones históricas a través de 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 es python3, por lo que si instaló el paquete python2 también debe reinstalarse.

2
robertmoggach 11 ago. 2019 a las 01:53

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 lo dijo el usuario12345, usando esta línea de comando:

sudo pip3.6 install gnureadline

:)

14
Serza 21 may. 2018 a las 18:24

Ninguna de estas respuestas me funcionó 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

0
DaVinci 16 oct. 2019 a las 15:31

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
Niall C. 25 jun. 2013 a las 21:09

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

1) Abre la 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
11
meetar 4 mar. 2015 a las 03:26

¿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
Forzar 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, p. 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
lothar 21 may. 2009 a las 14:53

Si usa Anaconda Python, puede solucionar esto ejecutando:

conda install readline

¡Trabajó para mi!

3
Adam Stewart 10 feb. 2017 a las 21:32

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

  1. instale gnureadline usando pip install gnureadline

Ahora puede hacer import gnureadline y las teclas de flecha deberían funcionar como se espera. Para que funcionen automáticamente, siga los siguientes pasos:

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

Una cosa que no funciona, pero que funcionó 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.

16
David Nathan 24 may. 2019 a las 08:50

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 DEPRECATED (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
26
user12345 26 may. 2017 a las 21:04

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
Tomas Ruiz 20 sep. 2017 a las 08:19