Видя escape-символы при нажатии клавиш со стрелками в оболочке python

В оболочках, таких как интерактивная оболочка python, вы обычно можете использовать клавиши со стрелками для перемещения по текущей строке или получения предыдущих команд (со стрелкой вверх) и т. Д.

Но после того, как я отправил ssh в другую машину и начал там python , я получаю такие сессии, как:

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

где последний символ происходит от стрелки вверх. Или, используя стрелку слева:

 >>> impor^[[D 

Как я могу это исправить?

В обычном bash клавиши со стрелками работают нормально. Странное поведение происходит только в интерактивной оболочке python (или perl и т. Д.).

Похоже, что 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 
  1. установите пакет readline-devel.
  2. перекомпилировать python с модулем readline
  3. Бинго!

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