Просмотр escape-символов при нажатии клавиш со стрелками в оболочке python
в оболочках, таких как интерактивная оболочка python, вы обычно можете использовать клавиши со стрелками для перемещения по текущей строке или получения предыдущих команд (со стрелкой вверх) и т. д.
но после того, как я ssh в другую машину и начать python
там, я получаю сеансы, такие как:
>>> import os
>>> ^[[A
, где последний символ происходит от стрелка-вверх. Или, используя стрелку влево:
>>> impor^[[D
как я могу это исправить?
в обычном bash клавиши со стрелками работают нормально. Странное поведение просто в интерактивном python (или perl и т. д.) оболочка.
18 ответов
похоже, что readline не включен. Проверьте, если PYTHONSTARTUP
переменная определена, для меня это указывает на /etc/pythonstart
и этот файл выполняется процессом python перед интерактивным, который настраивает обработку readline/history.
спасибо @Чаун вот документы на это: http://docs.python.org/2/tutorial/interactive.html
на OS X, обновления Xcode иногда ломаются readline
. Решение:
brew uninstall readline
brew upgrade python3
brew install readline
pip3 install readline
если проблема все еще сохраняется, попробуйте удалить readline
используя pip
и установите его с помощью easy_install
:
pip3 uninstall readline
easy_install readline
на OS X у меня другая проблема.
когда я использую системную оболочку python, ключи не проблема, но проблема в virtualenv. Я бы попытался переустановить / обновить virtualenv / readline и ничего не исправил.
пока я пытаюсь import readline
в проблемной оболочке python получите это сообщение об ошибке:
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
причина /usr/local/opt/readline/lib/libreadline.7.dylib
а не libreadline.6.dylib
, поэтому я делаю символическую ссылку:
ln libreadline.7.dylib libreadline.6.dylib
проблема решена!
вот шаги, которые работали для меня в ubuntu 12.04 для python 3.3.
1) Откройте teminal и напишите sudo apt-get install libreadline-dev
2) Загрузите исходный файл python 3.3.2 из http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz
3) извлеките его и перейдите в каталог Python-3.3.2 / в оболочке
4) выполните следующую команду:
./configure
make
make test
sudo make install
в OS X, используя python 3.5 и virtualenv
$ pip install gnureadline
в интерпретаторе делать:
import gnureadline
Теперь клавиши со стрелками должны работать правильно.
дополнительная информация...
обратите внимание, что по состоянию на 1 октября 2015-readline был устарел (источник https://github.com/ludwigschwardt/python-readline)
использовать gnureadline (см.: https://github.com/ludwigschwardt/python-gnureadline)
Если я устанавливаю readline вместо gnureadline с помощью python 3.5, я получаю ошибки после попытки импорта в интерпретаторе:
>>> 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
был затронут после обновления Mac до High Sierra, это успешно разрешило его для меня:
brew unlink python
xcode-select --install
brew install python
на CentOS, я исправляю это
yum install readline-devel
а затем перекомпилировать python 3.4.
на OpenSUSE я исправляю это
pip3 install readline
после ответа Валерио Крини.
возможно," pip3 install readline " является общим решением. Не пробовал свои CentOS.
я исправил это, сделав следующее:
- yum установить readline-devel
-
pip установить readline
-
я столкнулся с другой ошибкой здесь:
gcc: readline/libreadline.a: No such file or directory
gcc: readline/libhistory.a: No such file or directory
я исправил это путем установки
patch
:yum install patch
-
после этого мне удалось запустить pip install readline
успешно, который решил escape-символы в моем python ракушка.
FYI, я использую RedHat
У меня были проблемы с историей оболочки (команды tab/arrows) Python 3.6.x на Ubuntu 16.04 LTS.
Python 3.6.x был установлен из источника.
для меня было решено установить модуль "gnureadline", как сказал user12345, используя эту командную строку:
sudo pip3.6 install gnureadline
:)
Если вы используете Anaconda Python, вы можете исправить это, запустив:
conda install readline
работал на меня!
вы пробовали использовать другой клиент SSH? Некоторые клиенты SSH имеют специальные встроенные приложения ключей для различных удаленных процессов. Я часто сталкивался с этим с emacs.
какой клиент вы используете? Я бы рекомендовал попробовать Putty и SecureCRT сравнить их поведение.
вы вызывали ssh с помощью - t параметр, чтобы сказать ssh выделить виртуальный терминал для вас?
из man-страницы:
- t
Принудительное псевдо-распределение tty. Это может использоваться для выполнения произвольных экранных программ на удаленной машине, что может быть очень полезно, например, при реализации сервисов меню. Несколько параметров t принудительно выделяют tty, даже если ssh не имеет локального tty.
кроме того, вы также можете иметь чтобы установить термин переменная среды на сервере правильно, как предложено в другом сообщении.
для тех, кто использует conda, установка пакета readline из канала conda-forge исправит проблему:
conda install -c conda-forge readline=6.2
Как ваша переменная env $TERM set [a], когда все работает нормально и [b], когда они этого не делают? Настройки Env часто являются ключом к таким проблемам.
попробуйте получить библиотеку кода ключа, работающую на сервере. Если это не работает, попробуйте загрузить библиотеку с возможностью чтения ключа.
Я пытался построить Python 2.7 на Ubuntu 14.0. Вам понадобится libreadline-dev. Однако, если вы получаете его от apt-get, текущая версия 6.3, которая несовместима с Python 2.7 (не уверен в Python 3). Например, тип данных " Function "и" CPPFunction", которые были определены в предыдущих версиях readline, был удален в 6.3, как сообщается здесь:
https://github.com/yyuu/pyenv/issues/126
то есть вам нужно получить исходный код более ранней версии readline. Я установил libreadline 5.2 из apt-get для библиотеки и получил исходный код 5.2 для файлов заголовков. Поместите их в /usr / include.
наконец-то проблема решена.