web-dev-qa-db-fra.com

Voir les caractères d'échappement lorsque vous appuyez sur les touches fléchées dans un shell python

Dans des shells comme le shell python interactif, vous pouvez généralement utiliser les touches fléchées pour vous déplacer dans la ligne en cours ou obtenir les commandes précédentes (avec la flèche vers le haut), etc.

Mais après avoir ssh dans une autre machine et y avoir lancé python, je reçois des sessions du type:

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

où le dernier caractère vient de flèche vers le haut. Ou, en utilisant flèche vers la gauche:

>>> impor^[[D

Comment puis-je réparer cela?

Dans le bash régulier, les touches fléchées fonctionnent bien. Le comportement étrange ne concerne que le shell interactif Python (ou Perl, etc.).

132
Frank

On dirait que readline n'est pas activé. Vérifiez si la variable PYTHONSTARTUP est définie. Pour moi, elle pointe sur /etc/pythonstart et ce fichier est exécuté par le processus python avant de devenir interactif, ce qui configure la gestion de la lecture/historique.

Merci à @chown voici la documentation sur ceci: http://docs.python.org/2/tutorial/interactive.html

25
ismail

J'ai résolu ce problème en installant le paquet readline:

pip install readline
72
Valerio Crini

Sur OS X, les mises à jour Xcode cassent parfois readline. Solution:

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

Si le problème persiste, essayez de supprimer readline à l'aide de pip et installez-le à l'aide de easy_install:

pip3 uninstall readline
easy_install readline
40
Max Malysh

Sur OS X, j'ai un problème différent.

Lorsque j'utilise le système python Shell, les clés ne posent aucun problème, mais un problème dans virtualenv. J'essayerais de réinstaller/mettre à jour virtualenv/readline et rien ne sera corrigé.

Pendant que j'essaie de import readline dans un problème de shell avec Python, j'obtiens le message d'erreur suivant:

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

Parce qu'il y a /usr/local/opt/readline/lib/libreadline.7.dylib mais pas libreadline.6.dylib, je crée donc un lien de symbole:

ln libreadline.7.dylib libreadline.6.dylib

Le problème a été résolu!

36
raptor.zh
  1. installez le paquet readline-devel. 
  2. recompiler python avec le module readline
  3. Bingo!
15
Eric Wang

Voici les étapes qui ont fonctionné pour moi dans Ubuntu 12.04 pour Python 3.3.

1) ouvrez le terminal et écrivez Sudo apt-get install libreadline-dev

2) téléchargez le fichier source de python 3.3.2 depuis http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz

3) extrayez-le et accédez au répertoire Python-3.3.2/dans un shell

4) exécutez la commande suivante:

./configure
make
make test
Sudo make install
10
aabhas

Sous OS X, utilisation de python 3.5 et virtualenv

$ pip install gnureadline

Dans l'interprète faire: 

import gnureadline

Maintenant, les touches fléchées devraient fonctionner correctement. 


Information additionnelle...

Notez que depuis le 1er octobre 2015 - readline a été OBSOLÈTE (source https://github.com/ludwigschwardt/python-readline )

Utilisez plutôt gnureadline (voir: https://github.com/ludwigschwardt/python-gnureadline )

Si j'installe readline à la place de gnureadline à l'aide de Python 3.5, je reçois des erreurs après une tentative d'importation dans l'interpréteur: 

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

J'ai eu des problèmes avec l'historique Shell (commandes tabulation/flèches) de Python 3.6.x sur Ubuntu 16.04 LTS.

Python 3.6.x a été installé à partir du code source.

Ce qui a résolu pour moi, c’est d’installer le module "gnureadline" comme dit par user12345, en utilisant cette ligne de commande:

Sudo pip3.6 install gnureadline

:)

8
Serza

A été impacté après la mise à niveau de Mac vers High Sierra, cela a été résolu avec succès pour moi:

brew unlink python
xcode-select --install
brew install python
7
Big Perm

J'ai rencontré ce problème récemment et après avoir lu beaucoup de choses sur pip install readline (ne fonctionne pas pour mac osx) et pip install gnureadline et que je ne suis pas satisfait, voici maintenant ma configuration qui permet d'utiliser les touches fléchées dans n'importe quelle console Python:

  1. installez gnureadline en utilisant pip install gnureadline

maintenant, vous pouvez soit faire import gnureadline et les touches fléchées doivent fonctionner comme prévu. Pour les faire fonctionner automatiquement, suivez les étapes suivantes:

  1. créer (ou ajouter au fichier) ~/.startup.py: import gnureadline
  2. ajouter au fichier ~/.bash_profile: export PYTHONSTARTUP=~/.startup.py

Une chose qui ne fonctionne pas, mais qui était dans ma configuration précédente est: l’importation automatique de gnureadline sur pdb.set_trace(). Si quelqu'un a une bonne solution à ce problème, je serais reconnaissant pour un commentaire.

5
David Nathan

Sur CentOS, je résous ce problème en 

yum install readline-devel

puis recompilez Python 3.4.

Sur OpenSUSE, je résous ce problème en

pip3 install readline

suite à la réponse de Valerio Crini.

Peut-être que "pip3 install readline" est une solution générale. Je n'ai pas essayé sur mon CentOS.

4
peter pan gz

J'ai corrigé cela en procédant comme suit:

  • miam installer readline-devel
  • pip installer readline

    • J'ai rencontré une autre erreur ici:

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

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

      J'ai résolu ce problème en installant patch:

      yum install patch

Après cela, j'ai réussi à exécuter pip install readline, ce qui a résolu les caractères d'échappement de mon shell python.

FYI, j'utilise RedHat

3
juanpaolo

Si vous utilisez Anaconda Python, vous pouvez résoudre ce problème en exécutant:

conda install readline

Travaillé pour moi!

2
Adam Stewart

Avez-vous appelé ssh avec le paramètre -t pour dire à ssh d’allouer un terminal virtuel pour vous?

De la page de manuel:

-t
Forcer l'allocation de pseudo-tty. Cela peut être utilisé pour exécuter des programmes d'écran arbitraires sur une machine distante, ce qui peut s'avérer très utile, par exemple. lors de la mise en œuvre des services de menu. Les options -t multiples forcent l'allocation tty, même si ssh n'a pas de tty local.

En outre, vous devrez peut-être également définir correctement la variable d'environnementTERMsur le serveur, comme suggéré dans un autre message.

2
lothar

Pour ceux qui utilisent conda, installer le paquet readline depuis le canal conda-forge résoudra le problème:

conda install -c conda-forge readline=6.2
1
Tomas Ruiz

Avez-vous essayé d'utiliser un autre client SSH? Certains clients SSH disposent de mappages de touches spécifiques intégrés pour différents processus distants. J'ai souvent croisé celui-ci avec emacs.

Quel client utilisez-vous? Je recommanderais d'essayer PuTTY et SecureCRT pour comparer leur comportement.

1
JoshJordan

Sur Mac OS X, Mojave 10.14.6 avec diverses installations historiques via brew j'ai résolu le problème avec:

brew reinstall python2

Il n'y a probablement pas de solution miracle étant donné que tout le monde a un scénario d'installation différent. J'ai aussi essayé ce qui précède, donc il se peut que certaines des réponses soient combinées. La valeur par défaut de Brew est python3 donc si vous avez installé le package python2, il doit également être réinstallé.

1
mogga

le module readline est obsolète, ce qui entraînera une erreur de pointeur non valide dans les dernières versions de Python lors de l'exécution de quit () ou de exit () dans python Shell .pip install gnureadline à la place

0
Bill Greens

Essayez d’exécuter une bibliothèque de codes de clés sur le serveur. Si cela ne fonctionne pas, essayez de télécharger une bibliothèque avec la capacité de lecture-clé.

0
Interesting...

Comment votre variable env $ TERM est-elle définie [a] lorsque tout va bien et [b] quand cela ne fonctionne pas? Les paramètres Env sont souvent la clé de ces problèmes.

0
Alex Martelli

J'essayais de construire Python 2.7 sur Ubuntu 14.0. Vous aurez besoin de libreadline-dev. Cependant, si vous l'obtenez auprès d'apt-get, la version actuelle est la 6.3, ce qui est incompatible avec Python 2.7 (pas sûr de Python 3). Par exemple, les types de données "Function" et "CPPFunction", qui étaient définis dans les versions précédentes de readline, ont été supprimés en 6.3, comme indiqué ici:

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

C'est-à-dire que vous devez obtenir le code source d'une version antérieure de readline. J'ai installé libreadline 5.2 à partir d'apt-get pour la bibliothèque et récupère le code source de la version 5.2 pour les fichiers d'en-tête. Mettez-les dans/usr/include. 

Enfin, le problème a été résolu. 

0
AeroD

Sur OS X, cela a fonctionné pour moi:

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