python shell ssh arrow-keys

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



ssh arrow-keys (18)

  1. instalar el paquete readline-devel.
  2. recompilar Python con el módulo readline
  3. ¡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

:)