Anzeigen von Escape-Zeichen beim Drücken der Pfeiltasten in der Python-Shell


191

In Shells wie der interaktiven Python-Shell können Sie normalerweise die Pfeiltasten verwenden, um sich in der aktuellen Zeile zu bewegen oder vorherige Befehle (mit Pfeil nach oben) usw. abzurufen.

Aber nachdem ich in eine andere Maschine ssh und dort gestartet habe python, bekomme ich Sitzungen wie:

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

wo das letzte Zeichen von Pfeil nach oben kommt. Oder mit Pfeil nach links:

>>> impor^[[D

Wie kann ich das beheben?

In der regulären Bash funktionieren die Pfeiltasten einwandfrei. Das seltsame Verhalten ist nur in der interaktiven Python-Shell (oder Perl-Shell usw.).


Ich denke das gehört auf Serverfehler. Dies wird durch einen falschen Terminaltyp verursacht.
Epochwolf

Ich stimme Cartman unten zu, dass es sich um ein Readline-Problem handelt, nicht um ein Problem mit dem Terminaltyp.
Frank

2
easy_install readline und dann easy_install ipython funktionieren perfekt auf dem Mac.
Gnuyoga

installiere anaconda2 oder anaconda3 und setze .pystartup siehe Link
Leon WANG

1
@LeonWANG gibt eine schlechte Antwort - installieren Sie nicht etwas so Großes wie Anaconda, nur um Ihre .pystartup-Datei zum Laufen zu bringen. Völlig unnötig.
JDOGG

Antworten:


38

Es sieht so aus, als ob readline nicht aktiviert ist. Überprüfen Sie, ob eine PYTHONSTARTUPVariable definiert ist, auf die sie zeigt/etc/pythonstart und dass diese Datei vom Python-Prozess ausgeführt wird, bevor Sie interaktiv werden, wodurch die Readline- / Verlaufsbehandlung eingerichtet wird.

Dank @chown finden Sie hier die Dokumente dazu: http://docs.python.org/2/tutorial/interactive.html


Vielen Dank, ich stimme zu, dass readline das Problem zu sein scheint. Das System hat jedoch /usr/lib/libreadline.so.5. Es gibt keinen / etc / pythonstart.
Frank

1
Nach einigem googeln scheint es, dass Python auf diesem System nach der Installation von readline-devel möglicherweise neu kompiliert werden muss.
Frank

1
Die Umgebungsvariable ist PYTHONSTARTUPnicht PYTHONSTART. Ich bin mir nicht sicher über die verteilungsspezifische /etc/pythonstartDatei.
Ned Deily

1
Wenn Sie docs.python.org/2/tutorial/interactive.html lesen, erhalten Sie alle Informationen, die für eine Pystartup-Datei erforderlich sind.
chown

7
Auf OSX mit brauen, hatte alles , was ich zu tun warbrew reinstall python3
Ranhiru Jude Cooray

102

Ich habe dieses Problem durch die Installation des readlinePakets gelöst :

pip install readline

24
Ich musste libncurses-devauf meinem Ubuntu-Computer installieren und dann readline korrekt installieren.
Amir Eldor

4
Unter ncurses-develCentOS readlineinstalliert und dann kein Problem installiert. Die interaktive Shell funktioniert jetzt.
Einmal

1
yum install ncurses-devel
Alex Punnen

4
kann nicht pip install readlineauf meinem OS X-Computer, schlägt jedes Mal fehl, auch nach erfolgreicher brew install readline
Ausführung

9
Ich musste gnureadlinestattdessen installieren , siehe stackoverflow.com/q/43013060/2846923
Der

82

Unter OS X habe ich ein anderes Problem.

Wenn ich die System-Python-Shell verwende, sind die Schlüssel kein Problem, aber ein Problem in virtualenv. Ich würde versuchen, virtualenv / readline neu zu installieren / zu aktualisieren und nichts behoben.

Während ich versuche, import readlinein Problem Python Shell, erhalten Sie diese Fehlermeldung:

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

Weil es /usr/local/opt/readline/lib/libreadline.7.dylibaber keine gibt libreadline.6.dylib, mache ich einen Symbollink:

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

Das Problem wurde gelöst!


Nachdem ich gesucht und gesucht hatte, konnte ich das Problem mit diesem Vorschlag beheben. Vielen Dank!
gl051

Verursacht dies kein Problem, wenn etwas v6 aufruft und nicht merkt, dass es tatsächlich v7 ist?
Adam Barnes

3
Ich hatte das gleiche Problem, aber anstelle dieser Anweisungen tat ich es brew update && brew upgrade. Ob dies PHP kaputt machte, bleibt abzuwarten.
Adam Barnes

@AdamBarnes Das hat auch den Trick für mich getan. Ich verwende auch pyenv, daher muss ich die Python-Versionen deinstallieren / neu installieren, die ich nach dem Upgrade aller Homebrew-Pakete benötigte.
Funseiki

3
Ich hatte libreadline.7.dylib nicht (vielleicht weil ich auf Mojave 10.14.x bin und dann XCode 10.2.1 aktualisiert habe), sondern stattdessen Version 8. Durch Ausführen wurde ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylibdas Problem der Scan-Codes behoben, der Rückruf von Verlaufsbefehlen wurde jedoch nicht zurückgerufen. Obwohl in diesem Fall eine halbe Korrektur besser ist als keine. (Ja, ich habe auch einen Link für 6 hinzugefügt, kein Unterschied). Nachtrag: Dies war / ist für mich nur ein Problem mit Python2. python3 hat ohne die links gut funktioniert.
Zim

51

Unter OS X werden Xcode-Updates manchmal unterbrochen readline. Lösung:

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

Wenn das Problem weiterhin besteht, versuchen Sie, readlineusing zu entfernen pipund mithilfe von zu installiereneasy_install :

pip3 uninstall readline
easy_install readline

Gibt es ein Äquivalent, wenn Sie das System Python 2.7.10 verwenden?
user5359531

3
@ user5359531 Ich habe die Antwort mit einer easy_installOption aktualisiert
Max Malysh

OSX 10.12 Benutzer auch: stackoverflow.com/questions/7375545/…
ptim

1
Die Verwendung easy_installfunktioniert für mich, während die mit pip nicht funktioniert.
halb

1
Dies zusammen mit dem brew link readline(obwohl es bereits verlinkt war) hat es für mich behoben.
Richard Rast

28

Unter OS X mit Python 3.5 und virtualenv

$ pip install gnureadline

Im Dolmetscher tun Sie:

import gnureadline

Jetzt sollten die Pfeiltasten ordnungsgemäß funktionieren.


Zusätzliche Information...

Beachten Sie, dass zum 1. Oktober 2015 - readline VERRINGERT wurde (Quelle https://github.com/ludwigschwardt/python-readline )

Verwenden Sie stattdessen gnureadline (siehe: https://github.com/ludwigschwardt/python-gnureadline )

Wenn ich readline anstelle von gnureadline mit Python 3.5 installiere, erhalte ich nach dem Importversuch im Interpreter folgende Fehler:

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

Das funktioniert, aber es bedeutet, dass ich import gnureadlineoben in jeder interaktiven Sitzung etwas hinzufügen muss, was wirklich ärgerlich ist. Gibt es eine Möglichkeit, dies zu Beginn jeder interaktiven Sitzung zu starten?
Anton Codes

1
@Panchishin versuchen , das verwenden PYTHONUmgebungsVariable , eine Datei zu benennen , die Python ausgeführt hat Befehle , bevor die interaktive Eingabeaufforderung angezeigt wird (dh ). Für mögliche andere Ideen siehe auch: Python-Befehlszeileninterpreter mit automatisch geladenen Importenimport gnureadline
ausführen

19

Ich bin kürzlich auf dieses Problem pip install readlinegestoßen, nachdem ich viel darüber gelesen habe (funktioniert nicht für Mac OSX) pip install gnureadlineund nicht zufrieden bin. Dies ist jetzt mein Setup, das die Verwendung von Pfeiltasten in jeder Python-Konsole ermöglicht:

  1. installiere gnureadline mit pip install gnureadline

Jetzt können Sie entweder tun import gnureadlineund die Pfeiltasten sollten wie erwartet funktionieren. Führen Sie die folgenden Schritte aus, damit sie automatisch funktionieren:

  1. Datei erstellen (oder anhängen) ~/.startup.py:import gnureadline
  2. an Datei anhängen ~/.bash_profile:export PYTHONSTARTUP=~/.startup.py

Eine Sache, die nicht funktioniert, aber in meinem vorherigen Setup funktioniert hat, ist: automatischer Import von gnureadline on pdb.set_trace(). Wenn jemand eine gute Lösung für dieses Problem hat, wäre ich für einen Kommentar dankbar.


15
  1. Installieren Sie das readline-devel-Paket.
  2. Python mit Readline-Modul neu kompilieren
  3. Bingo!

2
Vielen Dank für die Verbesserung meiner Lebensqualität! {;-) Auf Centos 5.5 ist das yum install readline-devel und Sie müssen readline nicht explizit in der Neukompilierung angeben
michela

3
Wie kompilieren wir Python neu? Muss ich Python-Extrakt aus dem Quellcode installieren (./configure, make, make install), virtualenv einrichten und alle meine Pakete erneut installieren?
Muhammad Waqar

14

Ich hatte Probleme mit dem Shell-Verlauf (Tab / Arrows-Befehle) von Python 3.6.x unter Ubuntu 16.04 LTS.

Python 3.6.x wurde von der Quelle installiert.

Was für mich gelöst wurde, war die Installation des Moduls "gnureadline", wie von user12345 gesagt, über diese Befehlszeile:

sudo pip3.6 install gnureadline

:) :)


1
Ich habe alle anderen Lösungen ausprobiert, aber diese funktionierte für mich für meine Python 3.6
Umair

1
Stellen Sie sicher, dass Sie import gnureadlinedie Shell aufrufen, damit sie funktioniert
David Schumann

3
Keine Notwendigkeit, sudo zu verwenden
Newalp

11

Hier sind die Schritte, die in Ubuntu 12.04 für Python 3.3 für mich funktioniert haben.

1) Teminal öffnen und schreiben sudo apt-get install libreadline-dev

2) Laden Sie die Quelldatei von Python 3.3.2 von http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz herunter

3) extrahieren Sie es und navigieren Sie zum Python-3.3.2 / -Verzeichnis in einer Shell

4) Führen Sie den folgenden Befehl aus:

./configure
make
make test
sudo make install

7

Wurde nach dem Upgrade des Mac auf High Sierra beeinträchtigt, wurde dies für mich erfolgreich behoben:

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

5

Unter CentOS behebe ich das durch

yum install readline-devel

und kompilieren Sie dann Python 3.4 neu.

Unter OpenSUSE behebe ich dies durch

pip3 install readline

nach der Antwort von Valerio Crini.

Vielleicht ist "pip3 install readline" eine allgemeine Lösung. Ich habe mein CentOS noch nicht ausprobiert.


Guter Anruf mit dem Readline-Devel-Tipp. Es funktionierte für mich auf einer Centos6.5-Maschine, die Python 2.7.8 durchsucht. Ich habe direkt angerufen, pip install readlineohne Python neu zu kompilieren, und es hat gut funktioniert.
Arjun

3

Ich habe dies behoben, indem ich Folgendes getan habe:

  • yum installiere readline-devel
  • pip readline installieren

    • Ich bin hier auf einen anderen Fehler gestoßen:

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

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

      Ich habe dies durch Installation behoben patch:

      yum install patch

Danach konnte ich pip install readlineerfolgreich laufen, was die Escape-Zeichen in meiner Python-Shell löste.

Zu Ihrer Information, ich benutze RedHat


CentOS 6.8, Python2.7.12, ein Erfolg
kkzxak47

3

Wenn Sie Anaconda Python verwenden, können Sie dies beheben, indem Sie Folgendes ausführen:

conda install readline

Hat für mich gearbeitet!


2
In meinem Fall readlineist bereits installiert, ich muss tun conda install ncurses, damit es funktioniert.
whenov

3

Wenn Sie conda verwenden, wird das Problem durch Installieren des readline-Pakets vom conda-forge-Kanal behoben:

conda install -c conda-forge readline=6.2

2

Haben Sie ssh mit dem Parameter -t aufgerufen , um ssh anzuweisen, ein virtuelles Terminal für Sie zuzuweisen?

Von der Manpage:

-t
Pseudo-Tty-Zuordnung erzwingen. Dies kann verwendet werden, um beliebige bildschirmbasierte Programme auf einem Remote-Computer auszuführen, was sehr nützlich sein kann, z. B. bei der Implementierung von Menüdiensten. Mehrere -t-Optionen erzwingen die Zuweisung von tty, auch wenn ssh keine lokale tty hat.

Darüber hinaus müssen Sie möglicherweise auch die Umgebungsvariable TERM auf dem Server korrekt festlegen , wie in einem anderen Beitrag vorgeschlagen.


2

Unter Mac OS X Mojave 10.14.6 mit verschiedenen historischen Installationen über brewlöste ich dies mit:

brew reinstall python2

Es gibt wahrscheinlich kein Wundermittel, da jeder ein anderes Installationsszenario hat. Ich habe auch das Obige ausprobiert, so dass es möglicherweise eine Kombination einiger der Antworten war. Der Standardwert für Brew ist, python3dass das python2Paket , wenn Sie es installiert haben, ebenfalls neu installiert werden muss.


2

Keine dieser Antworten funktionierte für mich auf zwei verschiedenen Versionen von Ubuntu. Was für mich funktioniert hat, aber keine echte Lösung ist, ist das Umschließen meines Python-Codes in einen Aufruf von rlwrap(verfügbar in den Ubuntu-Repositorys):

rlwrap python mycode.py


1

Haben Sie versucht, einen anderen SSH-Client zu verwenden? Einige SSH-Clients verfügen über spezielle integrierte Keymappings für verschiedene Remoteprozesse. Ich bin oft mit Emacs auf diesen gestoßen.

Welchen Client verwenden Sie? Ich würde empfehlen, Putty und SecureCRT zu verwenden, um ihr Verhalten zu vergleichen.


Hmm, ich benutze nur den Befehl ssh im Terminal (ssh -v sagt OpenSSH_3.9p1, OpenSSL 0.9.7a 19. Februar 2003).
Frank

Probieren Sie Putty (kostenlos) aus und
melden Sie

Okay, ich habe gerade Putty installiert und damit eine Verbindung zur Maschine hergestellt, aber das Verhalten dort ist das gleiche.
Frank

:( Dann definitiv ein serverseitiges Problem. Ich werde es untersuchen und mich bei Ihnen
melden

Die Verwendung des Befehls ssh zum Herstellen einer Verbindung mit einem anderen Computer funktioniert einwandfrei: Dort habe ich keine Probleme mit den Pfeiltasten. Es scheint das einzige System zu sein, das Probleme hat.
Frank

1

Das Readline-Modul ist veraltet, was in den neuesten Python-Versionen zu ungültigen Zeigerfehlern führt, wenn quit () oder exit () in der Python-Shell ausgeführt wird. pip install gnureadlinestattdessen


0

Wie setzt Ihre env-Variable $ TERM [a], wenn die Dinge gut funktionieren, und [b], wenn sie nicht funktionieren? Env-Einstellungen sind oft der Schlüssel zu solchen Problemen.


1
Ich habe gerade einige TERM-Variablenwerte ausprobiert: vt102, vt220, ansi, xterm, aber keiner von ihnen hat das Verhalten geändert.
Frank

0

Versuchen Sie, eine Schlüsselcodebibliothek auf dem Server auszuführen. Wenn dies nicht funktioniert, versuchen Sie, eine Bibliothek mit Leseschlüssel herunterzuladen.


0

Ich habe versucht, Python 2.7 unter Ubuntu 14.0 zu erstellen. Sie benötigen libreadline-dev. Wenn Sie es jedoch von apt-get erhalten, ist die aktuelle Version 6.3, die nicht mit Python 2.7 kompatibel ist (nicht sicher über Python 3). Beispielsweise wurden die Datentypen "Function" und "CPPFunction", die in früheren Versionen von readline definiert wurden, in 6.3 entfernt, wie hier angegeben:

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

Das heißt, Sie müssen den Quellcode einer früheren Version von readline abrufen. Ich habe libreadline 5.2 von apt-get für die Bibliothek installiert und den Quellcode 5.2 für die Header-Dateien erhalten. Setzen Sie sie in / usr / include ein.

Schließlich wurde das Problem behoben.


0

Unter MacOsx habe ich dies behoben, indem ich readline neu installiert habe

brew reinstall readline
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.