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.).
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
J'ai résolu ce problème en installant le paquet readline
:
pip install readline
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
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!
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
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
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
:)
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
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:
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:
~/.startup.py
: import gnureadline
~/.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.
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.
J'ai corrigé cela en procédant comme suit:
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
Si vous utilisez Anaconda Python, vous pouvez résoudre ce problème en exécutant:
conda install readline
Travaillé pour moi!
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.
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
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.
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é.
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
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é.
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.
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.
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