Видя escape-символы при нажатии клавиш со стрелками в оболочке python
В оболочках, таких как интерактивная оболочка python, вы обычно можете использовать клавиши со стрелками для перемещения по текущей строке или получения предыдущих команд (со стрелкой вверх) и т. Д.
Но после того, как я отправил ssh в другую машину и начал там python
, я получаю такие сессии, как:
>>> import os >>> ^[[A
где последний символ происходит от стрелки вверх. Или, используя стрелку слева:
>>> impor^[[D
Как я могу это исправить?
В обычном bash клавиши со стрелками работают нормально. Странное поведение происходит только в интерактивной оболочке python (или perl и т. Д.).
- Есть ли способ передать все переменные в текущей области в Мако как контекст?
- Django – настраиваемый шаблон 403
- Модульные шаблоны в django
- Как распечатать разрывы строк в шаблоне Django Python
- Как включить автоматическое кэширование в шаблонах с расширением .jhtml в Flask?
Похоже, что readline не включен. Проверьте, определена ли переменная PYTHONSTARTUP
, для меня она указывает на /etc/pythonstart
и этот файл выполняется процессом python перед тем, как перейти в интерактивный режим, который настраивает обработку readline / history.
Благодаря @chown вот документы по этому поводу: http://docs.python.org/2/tutorial/interactive.html
Я решил эту проблему, установив пакет readline
:
pip install readline
В 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
- установите пакет readline-devel.
- перекомпилировать python с модулем 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) открыть текстовый файл и написать 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
В CentOS я исправлю это
yum install readline-devel
а затем перекомпилировать python 3.4.
В OpenSUSE я исправлю это
pip3 install readline
после ответа Валерио Крини.
Возможно, «pip3 install readline» является общим решением. Не пробовал мой CentOS.
Я исправил это, выполнив следующее:
- yum install readline-devel
-
pip read 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
Если вы используете Anaconda Python, вы можете исправить это, запустив:
conda install readline
Работал для меня!
Вы пробовали использовать другой SSH-клиент? Некоторые клиенты SSH имеют специальные встроенные сопоставления клавиш для разных удаленных процессов. Я столкнулся с этим много с emacs.
Какой клиент вы используете? Я бы рекомендовал попробовать Putty и SecureCRT сравнить их поведение.
Вы вызвали ssh с параметром -t, чтобы передать ssh для размещения виртуального терминала для вас?
На странице руководства:
-t
Принудительное распределение псевдо-tty. Это можно использовать для выполнения произвольных программ на экране на удаленной машине, что может быть очень полезно, например, при реализации сервисов меню. Множественные опции tt выделяют tty, даже если ssh не имеет локального tty.
Кроме того, вам также может потребоваться установить правильную переменную среды TERM на сервере, как было предложено в другом сообщении.
Как ваша переменная env $ TERM устанавливает [a], когда все работает нормально, и [b], когда они этого не делают? Настройки Env часто являются ключом к таким проблемам.
Попробуйте получить библиотеку кодовых ключей, запущенную на сервере. Если это не работает, попробуйте загрузить библиотеку с возможностью чтения.
Я пытался создать Python 2.7 на Ubuntu 14.0. Вам понадобится libreadline-dev. Однако, если вы получите его из apt-get, текущая версия будет 6.3, что несовместимо с Python 2.7 (не уверен в Python 3). Например, данные типа «Функция» и «CPPFunction», которые были определены в предыдущих версиях readline, были удалены в 6.3, как описано здесь:
https://github.com/yyuu/pyenv/issues/126
То есть вам нужно получить исходный код более ранней версии readline. Я установил libreadline 5.2 из apt-get для библиотеки и получаю исходный код 5.2 для файлов заголовков. Поместите их в / usr / include.
Наконец, проблема решена.
В OS X, используя python 3.5 и virtualenv
$ pip install gnureadline
В интерпретаторе выполните:
import gnureadline
Теперь клавиши со стрелками должны работать правильно.
Дополнительная информация…
Обратите внимание, что с 1 октября 2015 года readline был DEPRECATED (источник 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
Для тех, кто использует conda, установка пакета readline из conda-forge канала устранит проблему:
conda install -c conda-forge readline=6.2
- Поле формы Django не отображается
- как запустить этот код в шаблоне django
- Где вы храните переменные в jinja?
- Jinja2 как выполнить расширенную нарезку
- как вставить какой-либо текст во весь контекст django с использованием промежуточного программного обеспечения django
- Вывести все переменные в шаблон Мако
- Мако: передача переменных в базовые и дочерние шаблоны
- передача переменной в импорт jinja или включение из родительского html-файла
- Get Flask показать изображение, не находящееся в статическом каталоге