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 python
tam 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.).
python
shell
ssh
arrow-keys
Szczery
źródło
źródło
Odpowiedzi:
Wygląda na to, że readline nie jest włączony. Sprawdź, czy
PYTHONSTARTUP
zmienna jest zdefiniowana, dla mnie wskazuje/etc/pythonstart
i 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
źródło
PYTHONSTARTUP
niePYTHONSTART
. Nie jestem pewien co do/etc/pythonstart
pliku specyficznego dla dystrybucji .brew reinstall python3
Rozwiązałem ten problem, instalując
readline
pakiet:źródło
libncurses-dev
na moim komputerze Ubuntu, a następnie poprawnie zainstalować readline.ncurses-devel
na CentOS, a następniereadline
zainstalowany bez problemu. Interaktywna powłoka działa teraz.pip install readline
na moim komputerze OS X, nie za każdym razem, nawet po pomyślnym robibrew install readline
gnureadline
zamiast tego, patrz stackoverflow.com/q/43013060/2846923W 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 readline
w problematycznej powłoce Pythona, otrzymuję ten komunikat o błędzie:Ponieważ jest,
/usr/local/opt/readline/lib/libreadline.7.dylib
ale nie malibreadline.6.dylib
, więc tworzę link do symbolu:Problem został rozwiązany!
źródło
brew update && brew upgrade
. To, czy to zepsuło PHP w tym procesie, dopiero się okaże.ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylib
naprawił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.W OS X aktualizacje Xcode czasem się psują
readline
. Rozwiązanie:Jeśli problem nadal występuje, spróbuj usunąć
readline
za pomocąpip
i zainstaluj go za pomocąeasy_install
:źródło
easy_install
opcjąeasy_install
działa dla mnie, podczas gdy ten z pipem nie działa.brew link readline
(mimo że było już połączone) naprawiło to dla mnie.W systemie OS X przy użyciu języka Python 3.5 i virtualenv
W tłumaczu wykonaj:
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:
źródło
import gnureadline
na 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?import gnureadline
.). Możliwe inne pomysły zobacz także: uruchom interpreter wiersza poleceń Pythona z importami ładowanymi automatycznieOstatnio natknąłem się na ten problem i po przeczytaniu dużo o
pip install readline
(nie działa na Mac OSX) ipip install gnureadline
niezadowoleniu, to teraz moja konfiguracja, która umożliwia używanie klawiszy strzałek w dowolnej konsoli Pythona:pip install gnureadline
teraz możesz to zrobić,
import gnureadline
a klawisze strzałek powinny działać zgodnie z oczekiwaniami. Aby działały automatycznie, wykonaj następujące czynności:~/.startup.py
:import gnureadline
~/.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.źródło
źródło
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ń:
:)
źródło
import gnureadline
do powłoki, żeby zadziałałaOto 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:
źródło
Wpłynęło na to po uaktualnieniu komputera Mac do High Sierra, co z powodzeniem rozwiązało to dla mnie:
źródło
W CentOS naprawiam to przez
yum install readline-devel
a następnie ponownie skompiluj python 3.4.
W OpenSUSE naprawiam to przez
po odpowiedzi Valerio Criniego.
Być może „readline instalacji pip3” to ogólne rozwiązanie. Nie próbowałem na moim CentOS.
źródło
pip install readline
bez ponownej kompilacji Pythona i działało dobrze.Naprawiłem to, wykonując następujące czynności:
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 readline
pomyślnie, co rozwiązało znaki ucieczki w mojej powłoce pytona.Do Twojej wiadomości używam RedHat
źródło
Jeśli używasz Anaconda Python, możesz to naprawić, uruchamiając:
Pracował dla mnie!
źródło
readline
jest już zainstalowany, muszę zrobić,conda install ncurses
aby działał.Dla tych, którzy używają conda, zainstalowanie pakietu readline z kanału conda-forge rozwiąże problem:
źródło
Ż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
źródło
Czy wywołałeś ssh z parametrem -t , aby powiedzieć ssh, aby przydzielił ci terminal wirtualny?
Ze strony podręcznika:
Ponadto może być konieczne prawidłowe ustawienie zmiennej środowiskowej TERM na serwerze, jak sugerowano w innym poście.
źródło
W systemie Mac OS X Mojave 10.14.6 z różnymi historycznymi instalacjami
brew
rozwiązałem to za pomocą: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
python3
tak, więc jeśli zainstalowałeśpython2
pakiet, należy go również zainstalować ponownie.źródło
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.
źródło
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 gnureadline
zamiastźródło
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.
źródło
Spróbuj uruchomić bibliotekę kodów kluczy na serwerze. Jeśli to nie zadziała, spróbuj pobrać bibliotekę z możliwością odczytu.
źródło
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.
źródło
W MacOsx naprawiłem to, ponownie instalując readline
źródło