it-swarm.com.de

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

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 dem Pfeil nach oben) usw. abzurufen.

Aber nachdem ich ssh auf einen anderen Rechner gesetzt und dort python gestartet habe, bekomme ich Sitzungen wie:

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

woher kommt das letzte Zeichen von Pfeil nach oben. Oder verwenden Sie den Pfeil nach links:

>>> impor^[[D

Wie kann ich das beheben?

In der normalen Bash funktionieren die Pfeiltasten gut. Das seltsame Verhalten ist nur in der interaktiven Python (oder Perl usw.) Shell.

132
Frank

Sieht aus, als wäre readline nicht aktiviert. Prüfen Sie, ob die Variable PYTHONSTARTUP definiert ist. Sie zeigt für mich auf /etc/pythonstart und diese Datei wird vom Python-Prozess ausgeführt, bevor Sie mit dem interaktiven Vorgang beginnen.

Danke an @chown, hier sind die Dokumente dazu: http://docs.python.org/2/tutorial/interactive.html

25
ismail

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

pip install readline
72
Valerio Crini

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

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

Wenn das Problem weiterhin besteht, versuchen Sie, readline mit pip zu entfernen und es mit easy_install zu installieren:

pip3 uninstall readline
easy_install readline
40
Max Malysh

Unter OS X habe ich ein anderes Problem.

Wenn ich die System-Python-Shell verwende, ist der 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, in problem python Shell zu import readline zu kommen, erhalte ich folgende 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

Es gibt zwar /usr/local/opt/readline/lib/libreadline.7.dylib aber nicht libreadline.6.dylib, daher mache ich eine Symbolverbindung:

ln libreadline.7.dylib libreadline.6.dylib

Das Problem wurde gelöst!

36
raptor.zh
  1. installiere das Paket readline-devel. 
  2. python mit Readline-Modul neu kompilieren
  3. Bingo!
15
Eric Wang

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

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

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 in einer Shell zum Verzeichnis Python-3.3.2 /

4) führe folgenden Befehl aus:

./configure
make
make test
Sudo make install
10
aabhas

Unter OS X verwenden Sie Python 3.5 und Virtualenv

$ pip install gnureadline

Im Dolmetscher machen Sie: 

import gnureadline

Jetzt sollten die Pfeiltasten richtig funktionieren. 


Zusätzliche Information...

Beachten Sie, dass readline seit dem 1. Oktober 2015 NICHT MEHR EMPFOHLEN WIRD (source 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 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
9
user12345

Ich hatte Probleme mit der Shell-Historie (Tab/Pfeile-Befehle) von Python 3.6.x auf 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, mit dieser Befehlszeile:

Sudo pip3.6 install gnureadline

:)

8
Serza

War nach dem Upgrade von Mac auf High Sierra betroffen, wurde dies für mich erfolgreich gelöst:

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

Ich bin kürzlich auf dieses Problem gestoßen und nachdem ich viel über pip install readline (funktioniert nicht für Mac OSX) und pip install gnureadline gelesen habe und nicht zufrieden bin, ist dies nun 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 import gnureadline ausführen und die Pfeiltasten sollten wie erwartet funktionieren. Führen Sie die folgenden Schritte aus, damit sie automatisch funktionieren:

  1. erstelle (oder hänge an) eine Datei an ~/.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 der automatische Import von gnureadline auf pdb.set_trace(). Wenn jemand eine gute Lösung für dieses Problem hat, wäre ich für einen Kommentar dankbar.

5
David Nathan

Bei CentOS korrigiere ich das durch 

yum install readline-devel

und kompilieren Sie dann Python 3.4.

Bei OpenSUSE behebe ich dies durch

pip3 install readline

folgende Antwort von Valerio Crini.

Vielleicht ist "pip3 install readline" eine generelle Lösung. Habe meinen CentOS nicht probiert.

4
peter pan gz

Ich habe dies folgendermaßen behoben:

  • yum installiere readline-devel
  • pip install readline

    • 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 das Problem behoben, indem ich patch installiert habe:

      yum install patch

Danach konnte ich erfolgreich pip install readline ausführen, wodurch die Escape-Zeichen in meiner Python-Shell gelöst wurden.

Zur Info, ich benutze RedHat

3
juanpaolo

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

conda install readline

Arbeitete für mich!

2
Adam Stewart

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

Aus der Manpage:

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

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

2
lothar

Für diejenigen, die conda verwenden, wird das Problem durch das Installieren des readline-Pakets vom conda-forge-Kanal behoben:

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

Haben Sie versucht, einen anderen SSH-Client zu verwenden? Einige SSH-Clients verfügen über spezielle, integrierte Tastaturbelegungen für verschiedene Remote-Prozesse. Ich bin viel mit Emacs auf dieses Thema gestoßen.

Welchen Kunden benutzen Sie? Ich würde empfehlen, PuTTY und SecureCRT zu verwenden, um ihr Verhalten zu vergleichen.

1
JoshJordan

Unter Mac OS X Mojave 10.14.6 mit verschiedenen historischen Installationen über brew habe ich das gelöst mit:

brew reinstall python2

Es gibt wahrscheinlich keine magische Kugel, wenn jeder ein anderes Installationsszenario hat. Ich habe auch das oben Genannte ausprobiert, es könnte also eine Kombination einiger Antworten gewesen sein. Der Standardwert für Brew ist python3. Wenn Sie also das Paket python2 installiert haben, muss es ebenfalls neu installiert werden.

1
mogga

das readline-Modul ist veraltet, was zu einem ungültigen Zeigerfehler in den neuesten Python-Versionen führt, wenn stattdessen quit () oder exit () in der Python-Shell .pip install gnureadline ausgeführt wird

0
Bill Greens

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

0
Interesting...

Wie ist Ihre Env-Variable $ TERM gesetzt [a], wenn alles gut funktioniert und [b], wenn sie nicht funktioniert? Env-Einstellungen sind oft der Schlüssel zu solchen Problemen.

0
Alex Martelli

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

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

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

Schließlich wurde das Problem gelöst. 

0
AeroD

Unter OS X funktionierte das für mich:

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