Voir les caractères d'échappement en appuyant sur les touches fléchées dans le shell python


191

Dans les shells comme le shell python interactif, vous pouvez généralement utiliser les touches fléchées pour vous déplacer dans la ligne actuelle 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 pythony avoir commencé , j'ai des sessions comme:

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

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

>>> impor^[[D

Comment puis-je réparer cela?

Dans le bash normal, les touches fléchées fonctionnent bien. Le comportement étrange est juste dans le shell interactif python (ou perl etc.).


Je pense que cela appartient à la faute du serveur. Cela est dû à un type de terminal incorrect.
epochwolf

Je suis d'accord avec cartman ci-dessous qu'il s'agit d'un problème de lecture en ligne, pas d'un problème de type de terminal.
Frank

2
easy_install readline, puis easy_install ipython fonctionne parfaitement sous mac.
gnuyoga

installez anaconda2 ou anaconda3 et réglez .pystartup s'il vous plaît voir lien
Leon WANG

1
@LeonWANG donne une mauvaise réponse - n'installez pas quelque chose d'aussi énorme qu'anaconda juste pour faire fonctionner votre fichier .pystartup. Complètement inutile.
jdogg

Réponses:


38

Il semble que readline ne soit pas activé. Vérifiez si la PYTHONSTARTUPvariable est définie, pour moi elle pointe vers /etc/pythonstartet ce fichier est exécuté par le processus python avant de devenir interactif, ce qui configure la gestion de readline / history.

Merci à @chown, voici la documentation à ce sujet: http://docs.python.org/2/tutorial/interactive.html


Merci, je suis d'accord que readline semble être le problème. Le système a cependant /usr/lib/libreadline.so.5. Il n'y a pas de / etc / pythonstart.
Frank

1
Après quelques recherches sur Google, il semble que python sur ce système doive être recompilé, après l'installation de readline-devel.
Frank

1
La variable d'environnement ne l'est PYTHONSTARTUPpas PYTHONSTART. Je ne suis pas sûr du /etc/pythonstartfichier spécifique à la distribution .
Ned Deily

1
En fait, la lecture de docs.python.org/2/tutorial/interactive.html donne toutes les informations nécessaires pour un fichier pystartup.
chown

7
Sur OSX avec brew, tout ce que j'avais à faire étaitbrew reinstall python3
Ranhiru Jude Cooray

102

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

pip install readline

24
J'ai dû installer libncurses-devsur ma machine Ubuntu, puis readline correctement installé.
Amir Eldor du

4
Installé ncurses-develsur CentOS puis readlineinstallé sans problème. Le shell interactif fonctionne maintenant.
fois le

1
yum install ncurses-devel
Alex Punnen

4
ne peut pas pip install readlinesur ma machine OS X, échoue à chaque fois même après avoir réussibrew install readline
user5359531

10
J'ai dû installer à la gnureadlineplace, voir stackoverflow.com/q/43013060/2846923
The Guy with The Hat

82

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

Lorsque j'utilise le shell python système, les clés ne posent aucun problème, mais un problème dans virtualenv. J'essaierais de réinstaller / mettre à niveau virtualenv / readline et rien de fixe.

Pendant que j'essaye de import readlinerésoudre le problème du shell python, obtenez ce message d'erreur:

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 en a /usr/local/opt/readline/lib/libreadline.7.dylibmais pas libreadline.6.dylib, alors je crée un lien symbolique:

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

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


Après avoir cherché et cherché, j'ai pu résoudre le problème avec cette suggestion. Merci!
gl051

Cela ne causera-t-il pas un problème si quelque chose appelle la v6, sans se rendre compte qu'il s'agit en fait de la v7?
Adam Barnes

3
J'ai eu le même problème, mais au lieu de ces instructions, je l'ai fait brew update && brew upgrade. Reste à savoir si cela a cassé PHP dans le processus.
Adam Barnes

@AdamBarnes Cela a également fait l'affaire pour moi. J'utilise également pyenv, alors assurez-vous de désinstaller / réinstaller les versions de python dont j'avais besoin après la mise à niveau de tous les packages homebrew.
funseiki

3
Je n'avais pas libreadline.7.dylib (peut-être parce que je suis sur Mojave 10.14.x puis mis à jour XCode 10.2.1) mais j'avais la ver 8 à la place. L'exécution a ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylibrésolu le problème des codes de balayage, mais n'a pas ramener le rappel de la commande d'historique. Bien que dans ce cas, un demi-correctif vaut mieux que rien. (Oui, j'ai également ajouté un lien pour 6, aucune différence). Addendum: ce n'était / n'est qu'un problème avec python2 pour moi. python3 fonctionnait bien sans les liens.
Zim

51

Sous OS X, les mises à jour Xcode sont parfois interrompues readline. Solution:

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

Si le problème persiste, essayez de supprimer readline utilisant pipet installez-le en utilisant easy_install:

pip3 uninstall readline
easy_install readline

y a-t-il un équivalent si vous utilisez le système Python 2.7.10?
user5359531

3
@ user5359531 J'ai mis à jour la réponse avec une easy_installoption
Max Malysh

Utilisateurs d'OSX 10.12 également: stackoverflow.com/questions/7375545/…
ptim

1
L'utilisation easy_installfonctionne pour moi, tandis que celle avec pip ne fonctionne pas.
justhalf

1
Ceci combiné avec le brew link readline(même s'il était déjà lié) l'a corrigé pour moi.
Richard Rast

28

Sur OS X, en utilisant python 3.5 et virtualenv

$ pip install gnureadline

Dans l'interprète, faites:

import gnureadline

Les touches fléchées devraient maintenant fonctionner correctement.


Information additionnelle...

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

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

Si j'installe readline au lieu de gnureadline en utilisant 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

cela fonctionne, mais cela signifie que je dois ajouter import gnureadlineen haut de chaque session interactive, ce qui est vraiment ennuyeux. Existe-t-il un moyen de lancer cela au début de chaque session interactive?
Anton Codes

1
@Panchishin essaie d'utiliser la variable d'environnement PYTHONSTARTUP pour nommer un fichier qui a des commandes Python exécutées avant que l'invite interactive ne soit affichée (c'est-à-dire import gnureadline). Pour d'autres idées possibles, voir également: exécutez l'interpréteur de ligne de commande python avec les importations chargées automatiquement
user12345

20

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 gnureadlineet n'étant pas satisfait, c'est maintenant ma configuration qui permet d'utiliser les touches fléchées dans n'importe quelle console python:

  1. installer gnureadline en utilisant pip install gnureadline

maintenant vous pouvez le faire import gnureadlineet les touches fléchées devraient fonctionner comme prévu. Pour les faire fonctionner automatiquement, suivez les étapes suivantes:

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

Une chose qui ne fonctionne pas, mais qui a fait 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.


15
  1. installez le package readline-devel.
  2. recompiler python avec le module readline
  3. Bingo!

2
Merci d'avoir amélioré ma qualité de vie! {;-) Sur Centos 5.5, c'est yum install readline-devel et vous n'avez pas à spécifier explicitement readline dans la recompilation
michela

3
Comment recompiler Python? Dois-je installer extraire python à partir des sources (./configure, make, make install), configurer virtualenv et réinstaller tous mes packages?
Muhammad Waqar

14

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

Python 3.6.x a été installé à partir des sources.

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

sudo pip3.6 install gnureadline

:)


1
J'ai essayé toutes les autres solutions mais celle-ci a fonctionné pour moi pour mon Python 3.6
Umair

1
assurez-vous d'appeler import gnureadlinele shell pour que cela fonctionne
David Schumann

3
Pas besoin d'utiliser sudo
Newalp

11

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

7

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

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

5

Sur CentOS, je corrige cela en

yum install readline-devel

puis recompilez python 3.4.

Sur OpenSUSE, je corrige cela 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.


Bon appel avec la pointe readline-devel. Cela a fonctionné pour moi sur une machine Centos6.5 fouillant python 2.7.8. J'ai directement appelé pip install readlinesans recompiler python et cela a bien fonctionné.
Arjun

3

J'ai résolu ce problème en procédant comme suit:

  • yum 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 corrigé cela en installant patch:

      yum install patch

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

FYI, j'utilise RedHat


CentOS 6.8, Python2.7.12, un succès
kkzxak47

3

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

conda install readline

A travaillé pour moi!


2
Dans mon cas, readlineest déjà installé, je dois faire conda install ncursespour le faire fonctionner.
whenov

3

Pour ceux qui utilisent conda, l'installation du package readline à partir du canal conda-forge résoudra le problème:

conda install -c conda-forge readline=6.2

3

Aucune de ces réponses n'a fonctionné pour moi sur deux versions différentes d'Ubuntu. Ce qui a fonctionné pour moi, mais ce n'est pas un vrai correctif, consiste à envelopper mon code python dans un appel à rlwrap(disponible dans les référentiels ubuntu):

rlwrap python mycode.py


2

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

Depuis la page de manuel:

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

De plus, vous devrez peut-être définir correctement la variable d'environnement TERM sur le serveur, comme suggéré dans un autre article.


2

Sur Mac OS X Mojave 10.14.6 avec diverses installations historiques via, brewj'ai résolu cela avec:

brew reinstall python2

Il n'y a probablement pas de solution magique étant donné que tout le monde a un scénario d'installation différent. J'ai également essayé ce qui précède, donc cela peut avoir été une combinaison de quelques-unes des réponses. Brew par défaut, python3donc si vous avez installé le python2package, il doit également être réinstallé.


1

Avez-vous essayé d'utiliser un autre client SSH? Certains clients SSH ont des keymappings spéciaux et intégrés pour différents processus distants. J'ai beaucoup rencontré celui-ci avec emacs.

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


Hmm, j'utilise juste la commande ssh dans le terminal (ssh -v dit OpenSSH_3.9p1, OpenSSL 0.9.7a 19 février 2003).
Frank

Essayez Putty (c'est gratuit) et revenez vers nous :)
JoshJordan

D'accord, je viens d'installer du mastic et de l'utiliser pour me connecter à la machine, mais le comportement est le même.
Frank

:( Certainement un problème côté serveur alors. Je vais l'examiner et vous
contacter

Utiliser la commande ssh pour se connecter à une autre machine fonctionne très bien: là, je n'ai aucun problème avec les touches fléchées. Il semble que ce soit le seul système qui a des problèmes.
Frank

1

Le module readline est obsolète, ce qui provoquera une erreur de pointeur non valide dans les dernières versions de python lors de l'exécution de quit () ou exit () dans le shell python. pip install gnureadlineau lieu


0

Comment votre variable d'environnement $ TERM est-elle définie [a] quand les choses fonctionnent bien et [b] quand elles ne fonctionnent pas? Les paramètres d'environnement sont souvent la clé de tels problèmes.


1
J'ai juste essayé quelques valeurs de variable TERM: vt102, vt220, ansi, xterm, mais aucune d'elles n'a changé le comportement.
Frank

0

Essayez de faire fonctionner une bibliothèque de codes clés sur le serveur. Si cela ne fonctionne pas, essayez de télécharger une bibliothèque avec une capacité de clé de lecture.


0

J'essayais de construire Python 2.7 sur Ubuntu 14.0. Vous aurez besoin de libreadline-dev. Cependant, si vous l'obtenez depuis 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 "Fonction" et "CPPFunction", qui étaient définis dans les versions précédentes de readline, ont été supprimés dans la version 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 d'apt-get pour la bibliothèque et j'ai récupéré le code source de 5.2 pour les fichiers d'en-tête. Mettez-les dans / usr / include.

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


0

Sur MacOsx, j'ai corrigé ce problème en réinstallant readline

brew reinstall readline
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.