Widząc znaki specjalne podczas naciskania klawiszy strzałek w powłoce pytona


191

W powłokach, takich jak interaktywna powłoka python, zwykle można używać klawiszy strzałek, aby poruszać się w bieżącym wierszu lub uzyskać poprzednie polecenia (ze strzałką w górę) itp.

Ale po tym, jak ssh na innej maszynie i pythontam zacznę , dostaję sesje takie jak:

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

gdzie ostatnia postać pochodzi ze strzałki w górę. Lub używając strzałki w lewo:

>>> impor^[[D

Jak mogę to naprawić?

W zwykłym uderzeniu klawisze strzałek działają dobrze. Dziwne zachowanie jest po prostu w interaktywnej powłoce pytona (lub perla itp.).


Myślę, że należy to do błędu serwera. Jest to spowodowane niewłaściwym typem terminala.
epochwolf

Zgadzam się z Cartmanem poniżej, że jest to problem readline, a nie typ terminala.
Frank

2
easy_install readline, a następnie ipython easy_install działa idealnie w systemie Mac.
gnuyoga,

zainstaluj anaconda2 lub anaconda3 i ustaw .pystartup zobacz link
Leon WANG

1
@LeonWANG daje złą odpowiedź - nie instaluj czegoś tak dużego jak anakonda, aby uruchomić plik .pystartup. Całkowicie niepotrzebne.
jdogg

Odpowiedzi:


38

Wygląda na to, że readline nie jest włączony. Sprawdź, czy PYTHONSTARTUPzmienna jest zdefiniowana, dla mnie wskazuje /etc/pythonstarti plik ten jest wykonywany przez proces python przed przejściem interaktywnym, który konfiguruje obsługę readline / history.

Dzięki @chown tutaj są dokumenty na ten temat: http://docs.python.org/2/tutorial/interactive.html


Dzięki, zgadzam się, że problemem jest readline. System ma jednak /usr/lib/libreadline.so.5. Brak pliku / etc / pythonstart.
Frank

1
Po pewnym googlowaniu wydaje się, że po zainstalowaniu readline-devel może być konieczna ponowna kompilacja Pythona w tym systemie.
Frank

1
Zmienna środowiskowa to PYTHONSTARTUPnie PYTHONSTART. Nie jestem pewien co do /etc/pythonstartpliku specyficznego dla dystrybucji .
Ned Deily,

1
W rzeczywistości czytanie docs.python.org/2/tutorial/interactive.html daje wszystkie informacje potrzebne do pliku pystartup.
chown

7
W OSX z naparem wszystko, co musiałem zrobić, tobrew reinstall python3
Ranhiru Jude Cooray,

102

Rozwiązałem ten problem, instalując readlinepakiet:

pip install readline

24
Musiałem zainstalować libncurses-devna moim komputerze Ubuntu, a następnie poprawnie zainstalować readline.
Amir Eldor,

4
Zainstalowany ncurses-develna CentOS, a następnie readlinezainstalowany bez problemu. Interaktywna powłoka działa teraz.
one.time

1
mniam zainstalować ncurses-devel
Alex Punnen

4
Nie mogę pip install readlinena moim komputerze OS X, nie za każdym razem, nawet po pomyślnym robibrew install readline
user5359531

9
Musiałem zainstalować gnureadlinezamiast tego, patrz stackoverflow.com/q/43013060/2846923
Facet z kapeluszem

82

W systemie OS X mam inny problem.

Kiedy używam systemowej powłoki Pythona, klucze nie stanowią problemu, ale problem w virtualenv. Spróbowałbym ponownie zainstalować / uaktualnić virtualenv / readline i nic nie zostało naprawione.

Podczas gdy próbuję import readlinew problematycznej powłoce Pythona, otrzymuję ten komunikat o błędzie:

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

Ponieważ jest, /usr/local/opt/readline/lib/libreadline.7.dylibale nie ma libreadline.6.dylib, więc tworzę link do symbolu:

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

Problem został rozwiązany!


Po obejrzeniu i rozwiązaniu problemu udało mi się rozwiązać problem z tą sugestią. Dzięki!
gl051

Czy nie spowoduje to problemu, jeśli coś wywoła v6, nie zdając sobie sprawy, że tak naprawdę jest v7?
Adam Barnes

3
Miałem ten sam problem, ale zrobiłem to zamiast tych instrukcji brew update && brew upgrade. To, czy to zepsuło PHP w tym procesie, dopiero się okaże.
Adam Barnes

@AdamBarnes To też załatwiło sprawę. Używam również pyenv, więc upewnij się, że odinstalowałem / ponownie zainstalowałem wersje Pythona, których potrzebowałem po aktualizacji wszystkich pakietów homebrew.
funseiki,

3
Nie miałem libreadline.7.dylib (być może dlatego, że korzystam z Mojave 10.14.x, a następnie zaktualizowałem XCode 10.2.1), ale zamiast tego miałem wersję 8. Wykonanie ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylibnaprawiło problem skanowania kodów, ale nie przywróciło przywracania historii poleceń. Chociaż w tym przypadku połowa poprawki jest lepsza niż żadna. (Tak, dodałem również link do 6, bez różnicy). Dodatek: dla mnie to był / jest tylko problem z python2. python3 działał dobrze bez linków.
Zim

51

W OS X aktualizacje Xcode czasem się psują readline. Rozwiązanie:

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

Jeśli problem nadal występuje, spróbuj usunąć readlineza pomocą pipi zainstaluj go za pomocą easy_install:

pip3 uninstall readline
easy_install readline

czy istnieje odpowiednik, jeśli korzystasz z systemu Python 2.7.10?
user5359531,

3
@ user5359531 Zaktualizowałem odpowiedź z easy_installopcją
Max Malysh

Użytkownicy OSX 10.12 również: stackoverflow.com/questions/7375545/...
ptim

1
Używanie easy_installdziała dla mnie, podczas gdy ten z pipem nie działa.
justhalf

1
To w połączeniu z brew link readline(mimo że było już połączone) naprawiło to dla mnie.
Richard Rast,

28

W systemie OS X przy użyciu języka Python 3.5 i virtualenv

$ pip install gnureadline

W tłumaczu wykonaj:

import gnureadline

Teraz klawisze strzałek powinny działać poprawnie.


Dodatkowe informacje...

Należy pamiętać, że od 1 października 2015 r. - readline został WYRADZANY (źródło https://github.com/ludwigschwardt/python-readline )

Zamiast tego użyj gnureadliny (patrz: https://github.com/ludwigschwardt/python-gnureadline )

Jeśli zainstaluję readline zamiast gnureadline przy użyciu Pythona 3.5, po próbie zaimportowania do interpretera otrzymuję błędy:

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

to działa, ale oznacza to, że muszę dodawać import gnureadlinena górze każdej interaktywnej sesji, co jest naprawdę denerwujące. Czy istnieje sposób, aby rozpocząć to na początku każdej interaktywnej sesji?
Anton Codes

1
@Panchishin próbuje użyć zmiennej środowiskowej PYTHONSTARTUP do nazwania pliku, w którym polecenia Pythona są wykonywane przed wyświetleniem interaktywnego monitu (tj import gnureadline.). Możliwe inne pomysły zobacz także: uruchom interpreter wiersza poleceń Pythona z importami ładowanymi automatycznie
użytkownik12345

20

Ostatnio natknąłem się na ten problem i po przeczytaniu dużo o pip install readline(nie działa na Mac OSX) i pip install gnureadlineniezadowoleniu, to teraz moja konfiguracja, która umożliwia używanie klawiszy strzałek w dowolnej konsoli Pythona:

  1. zainstaluj gnureadline za pomocą pip install gnureadline

teraz możesz to zrobić, import gnureadlinea klawisze strzałek powinny działać zgodnie z oczekiwaniami. Aby działały automatycznie, wykonaj następujące czynności:

  1. utwórz (lub dołącz do) plik ~/.startup.py:import gnureadline
  2. dołącz do pliku ~/.bash_profile:export PYTHONSTARTUP=~/.startup.py

Jedną rzeczą, która nie działa, ale działała w mojej poprzedniej konfiguracji, jest: automatyczny import gnureadline włączony pdb.set_trace(). Jeśli ktoś ma dobre rozwiązanie tego problemu, byłbym wdzięczny za komentarz.


15
  1. zainstaluj pakiet readline-devel.
  2. przekompiluj python z modułem readline
  3. Bingo!

2
Dzięki za polepszenie mojej jakości życia! {;-) W Centos 5.5 to mniam zainstaluj readline-devel i nie musisz jawnie określać readline w rekompilacji
michela,

3
Jak rekompilujemy Python? Czy muszę zainstalować wypakować python ze źródła (./configure, make, make install), skonfigurować virtualenv i ponownie zainstalować wszystkie moje pakiety?
Muhammad Waqar,

14

Miałem problemy z historią powłoki (polecenia tab / strzałki) Python 3.6.x na Ubuntu 16.04 LTS.

Python 3.6.x został zainstalowany ze źródła.

Rozwiązaniem dla mnie było zainstalowanie modułu „gnureadline”, jak powiedział użytkownik12345, przy użyciu tego wiersza poleceń:

sudo pip3.6 install gnureadline

:)


1
Wypróbowałem wszystkie inne rozwiązania, ale to działało dla mnie dla mojego Pythona 3.6
Umair

1
zadzwoń import gnureadlinedo powłoki, żeby zadziałała
David Schumann,

3
Nie ma potrzeby korzystania z sudo
Newalp

11

Oto kroki, które działały dla mnie w Ubuntu 12.04 dla Pythona 3.3.

1) otwórz teminal i napisz sudo apt-get install libreadline-dev

2) pobierz plik źródłowy Pythona 3.3.2 z http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz

3) wypakuj go i przejdź do katalogu Python-3.3.2 / w powłoce

4) wykonaj następujące polecenie:

./configure
make
make test
sudo make install

7

Wpłynęło na to po uaktualnieniu komputera Mac do High Sierra, co z powodzeniem rozwiązało to dla mnie:

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

5

W CentOS naprawiam to przez

yum install readline-devel

a następnie ponownie skompiluj python 3.4.

W OpenSUSE naprawiam to przez

pip3 install readline

po odpowiedzi Valerio Criniego.

Być może „readline instalacji pip3” to ogólne rozwiązanie. Nie próbowałem na moim CentOS.


Dobra rozmowa dzięki wskazówce readline-devel. Działa to dla mnie na maszynowym pythonie Centos6.5 2.7.8. Zadzwoniłem bezpośrednio pip install readlinebez ponownej kompilacji Pythona i działało dobrze.
Arjun,

3

Naprawiłem to, wykonując następujące czynności:

  • mniam zainstaluj readline-devel
  • odczyt instalacji pip

    • Napotkałem tutaj inny błąd:

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

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

      Naprawiłem to, instalując patch:

      yum install patch

Potem udało mi się uruchomić pip install readlinepomyślnie, co rozwiązało znaki ucieczki w mojej powłoce pytona.

Do Twojej wiadomości używam RedHat


CentOS 6.8, Python2.7.12, sukces
kkzxak47

3

Jeśli używasz Anaconda Python, możesz to naprawić, uruchamiając:

conda install readline

Pracował dla mnie!


2
W moim przypadku readlinejest już zainstalowany, muszę zrobić, conda install ncursesaby działał.
whenov

3

Dla tych, którzy używają conda, zainstalowanie pakietu readline z kanału conda-forge rozwiąże problem:

conda install -c conda-forge readline=6.2

3

Żadna z tych odpowiedzi nie działała dla mnie w dwóch różnych wersjach Ubuntu. To, co zadziałało, ale nie jest prawdziwą poprawką, polega na zawijaniu mojego kodu python w wywołanie rlwrap(dostępne w repozytoriach ubuntu):

rlwrap python mycode.py


2

Czy wywołałeś ssh z parametrem -t , aby powiedzieć ssh, aby przydzielił ci terminal wirtualny?

Ze strony podręcznika:

-t
Wymusza alokację pseudo-tty. Można to wykorzystać do wykonania dowolnych programów ekranowych na zdalnym komputerze, co może być bardzo przydatne, np. Przy wdrażaniu usług menu. Wiele opcji -t wymusza alokację tty, nawet jeśli ssh nie ma lokalnego tty.

Ponadto może być konieczne prawidłowe ustawienie zmiennej środowiskowej TERM na serwerze, jak sugerowano w innym poście.


2

W systemie Mac OS X Mojave 10.14.6 z różnymi historycznymi instalacjami brewrozwiązałem to za pomocą:

brew reinstall python2

Prawdopodobnie nie ma magicznej kuli, biorąc pod uwagę, że każdy ma inny scenariusz instalacji. Próbowałem również powyższego, więc mogło to być połączenie kilku odpowiedzi. Brew domyślnie python3tak, więc jeśli zainstalowałeś python2pakiet, należy go również zainstalować ponownie.


1

Czy próbowałeś użyć innego klienta SSH? Niektórzy klienci SSH mają specjalne wbudowane mapowania klawiszy dla różnych zdalnych procesów. Wpadłem na to bardzo często z emacsem.

Z jakiego klienta korzystasz? Polecam wypróbować Putty i SecureCRT, aby porównać ich zachowanie.


Hmm, po prostu używam polecenia ssh w terminalu (ssh -v mówi OpenSSH_3.9p1, OpenSSL 0.9.7a 19 lutego 2003).
Frank

Wypróbuj Putty (za darmo) i wróć do nas :)
JoshJordan

Okej, właśnie zainstalowałem kit i użyłem go do połączenia z maszyną, ale zachowanie jest takie samo.
Frank

:( Zdecydowanie problem po stronie serwera.
Zajmę

Użycie polecenia ssh do połączenia z innym komputerem działa dobrze: Nie mam problemów z klawiszami strzałek. Wydaje się, że jest to jeden szczególny system, który ma problemy.
Frank

1

Moduł readline jest przestarzały, co spowoduje błąd nieprawidłowego wskaźnika w najnowszych wersjach Pythona podczas wykonywania quit () lub exit () w powłoce Pythona. pip install gnureadlinezamiast


0

Jak twoja zmienna env $ TERM jest ustawiona [a], kiedy wszystko działa dobrze i [b], gdy nie? Ustawienia środowiska są często kluczem do takich problemów.


1
Właśnie wypróbowałem niektóre wartości zmiennych TERM: vt102, vt220, ansi, xterm, ale żadna z nich nie zmieniła zachowania.
Frank

0

Spróbuj uruchomić bibliotekę kodów kluczy na serwerze. Jeśli to nie zadziała, spróbuj pobrać bibliotekę z możliwością odczytu.


0

Próbowałem zbudować Python 2.7 na Ubuntu 14.0. Będziesz potrzebował libreadline-dev. Jeśli jednak otrzymasz go z apt-get, bieżąca wersja to 6.3, co jest niezgodne z Python 2.7 (nie jestem pewien co do Python 3). Na przykład typ danych „Funkcja” i „CPPFunction”, które zostały zdefiniowane w poprzednich wersjach readline, został usunięty w 6.3, jak podano tutaj:

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

Oznacza to, że musisz uzyskać kod źródłowy wcześniejszej wersji readline. Zainstalowałem libreadline 5.2 z apt-get dla biblioteki i otrzymałem kod źródłowy 5.2 dla plików nagłówkowych. Umieść je w / usr / include.

Wreszcie problem został rozwiązany.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.