Просмотр 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


Я решил эту проблему путем установки 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

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

проблема решена!


  1. установить пакет readline-devel.
  2. перекомпилировать python с модулем readline
  3. Бинго!

вот шаги, которые работали для меня в 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.

наконец-то проблема решена.