Ver caracteres de escape al presionar las teclas de flecha en el shell de Python
ssh arrow-keys (18)
- instalar el paquete readline-devel.
- recompilar Python con el módulo readline
- ¡Bingo!
En shells como el shell de python interactivo, generalmente puede usar las teclas de flecha para moverse en la línea actual u obtener comandos previos (con flecha arriba), etc.
Pero después de entrar en otra máquina y comenzar python
allí, recibo sesiones como las siguientes:
>>> import os
>>> ^[[A
donde el último personaje viene de flecha arriba. O, usando la flecha izquierda:
>>> impor^[[D
¿Cómo puedo arreglar esto?
En el bash normal, las teclas de flecha funcionan bien. El comportamiento extraño está solo en el shell interactivo de python (o perl etc.).
¿Cómo es su variable env $ TERM establecida [a] cuando las cosas funcionan bien y [b] cuando no? La configuración de Env a menudo es la clave para tales problemas.
¿Ha llamado a ssh con el parámetro -t para decirle a ssh que le asigne un terminal virtual?
Desde la página man:
-t
Fuerza la asignación 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ú. Múltiples opciones t fuerzan la asignación de tty, incluso si ssh no tiene tty local.
Además, también puede tener que establecer la variable de entorno TERM en el servidor correctamente, como se sugiere en otra publicación.
¿Has intentado utilizar un cliente SSH diferente? Algunos clientes SSH tienen asignaciones de teclas especiales incorporadas 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.
En CentOS, soluciono esto por
yum install readline-devel
y luego recompilar Python 3.4.
En OpenSUSE, soluciono esto por
pip3 install readline
siguiendo la respuesta de Valerio Crini.
Quizás "pip3 install readline" es una solución general. No he probado en mi CentOS.
En OS X, las actualizaciones de Xcode a veces rompen readline
. Solución:
brew uninstall readline
brew upgrade python3
brew install readline
pip3 install readline
Si el problema persiste, intente eliminar readline
usando pip
e instálelo usando easy_install
:
pip3 uninstall readline
easy_install readline
En OS X, tengo un problema diferente.
Cuando uso el shell de python del sistema, las claves no son un problema, sino un problema en virtualenv. Intentaría reinstalar / actualizar virtualenv / readline y no se corrigió nada.
Mientras trato de import readline
en el shell de python problem, obtenga 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
, entonces hago un enlace de símbolo:
ln libreadline.7.dylib libreadline.6.dylib
¡El problema ha sido resuelto!
En OS X, usando python 3.5 y virtualenv
$ pip install gnureadline
En el intérprete do:
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 )
Use gnureadline en su lugar (vea: 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
Estaba intentando construir 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 eliminaron 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 obtengo el código fuente de 5.2 para los archivos de encabezado. Ponlos en / usr / include.
Finalmente el problema ha sido resuelto.
Estos son los pasos que funcionó para mí en Ubuntu 12.04 para Python 3.3.
1) abra el archivo y escriba 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
He resuelto este problema instalando el paquete readline
:
pip install readline
Intente obtener una biblioteca de códigos de tecla ejecutándose en el servidor. Si eso no funciona, intente descargar una biblioteca con capacidad de lectura.
Lo arreglé haciendo lo siguiente:
- yum install readline-devel
pip install readline
Me encontré con otro error aquí:
gcc: readline/libreadline.a: No such file or directory
gcc: readline/libhistory.a: No such file or directory
Lo solucioné instalando el
patch
:yum install patch
Después de eso me las arreglé para ejecutar pip install readline
éxito que resolvió los caracteres de escape en mi shell python.
FYI, estoy usando RedHat
Me impactó después de actualizar Mac a High Sierra, esto lo resolvió con éxito para mí:
brew unlink python
xcode-select --install
brew install python
Para aquellos que usan conda, la instalación del paquete readline del canal conda-forge solucionará el problema:
conda install -c conda-forge readline=6.2
Parece que readline no está habilitado. Verifique si la variable PYTHONSTARTUP
está definida, para mí apunta a /etc/pythonstart
y ese archivo es ejecutado por el proceso python antes de ir a interactuar, lo que configura el manejo de lectura / historial.
Gracias a @chown aquí están los documentos sobre esto: http://docs.python.org/2/tutorial/interactive.html
Si usa Anaconda Python, puede solucionarlo ejecutando:
conda install readline
¡Trabajó para mi!
Tuve problemas con el historial de shell (comandos de tab / arrows) de Python 3.6.x en Ubuntu 16.04 LTS.
Python 3.6.x se instaló desde la fuente.
Lo que resolví para mí fue instalar el módulo "gnureadline" como lo dijo el usuario12345, usando esta línea de comando:
sudo pip3.6 install gnureadline
:)