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

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

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

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

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

>>> impor^[[D

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

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

Ответ 1

Похоже, readline не включен. Проверьте, определена ли переменная PYTHONSTARTUP, для меня она указывает на /etc/pythonstart и этот файл выполняется процессом python перед переходом в интерактивный /etc/pythonstart что /etc/pythonstart обработку readline/history.

Благодаря @chown вот документы по этому вопросу: http://docs.python.org/2/tutorial/interactive.html

Ответ 2

Я решил эту проблему, установив пакет readline:

pip install 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 -s libreadline.7.dylib libreadline.6.dylib

Проблема была решена!

Ответ 4

В 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

Ответ 5

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

Ответ 6

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

Ответ 7

Я недавно столкнулся с этой проблемой, и после прочтения большого количества информации о pip install readline (не работает для mac osx) и pip install gnureadline и pip install gnureadline не устраивает, теперь это моя установка, которая позволяет использовать клавиши со стрелками в любой консоли python:

  1. установить gnureadline используя pip install gnureadline

теперь вы можете выполнить import gnureadline и клавиши со стрелками должны работать как положено. Чтобы они работали автоматически, выполните следующие действия:

  1. создать (или добавить) файл ~/.startup.py: import gnureadline
  2. добавить в файл ~/.bash_profile: export PYTHONSTARTUP=~/.startup.py

Одна вещь, которая не работает, но работала в моей предыдущей установке: автоматический импорт gnureadline в pdb.set_trace(). Если у кого-то есть хорошее решение этой проблемы, я был бы благодарен за комментарий.

Ответ 8

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

Ответ 9

У меня были проблемы с историей оболочки (команды tab/arrow) Python 3.6.x в Ubuntu 16.04 LTS.

Python 3.6.x был установлен из исходного кода.

Для меня было решено установить модуль "gnureadline", как сказал user12345, используя эту командную строку:

sudo pip3.6 install gnureadline

:)

Ответ 10

Насилился после обновления Mac до High Sierra, это успешно разрешило это для меня:

brew unlink python
xcode-select --install
brew install python

Ответ 11

В CentOS я исправляю это

yum install readline-devel

а затем перекомпилируйте python 3.4.

В OpenSUSE я исправляю это с помощью

pip3 install readline

после ответа Валерио Крини.

Возможно, "pip3 install readline" является общим решением. Не пробовал мой CentOS.

Ответ 12

Я исправил это, выполнив следующее:

  • yum install readline-devel
  • pip install 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

Ответ 13

Если вы используете Anaconda Python, вы можете исправить это, выполнив:

conda install readline

Работал для меня!

Ответ 14

Вы вызвали ssh с параметром -t, чтобы передать ssh для размещения виртуального терминала для вас?

На странице man:

-t
 Принудительное распределение псевдо-tty. Это может быть использовано для выполнения произвольных программ на основе экрана на удаленной машине, что может быть очень полезно, например. при реализации услуг меню. Множество опций -t принудительно назначают tty, даже если ssh не имеет локального tty.

Кроме того, вам также может потребоваться установить правильную переменную среды TERM на сервере, как указано в другом сообщении.

Ответ 15

В Mac OS X Mojave 10.14.6 с различными историческими установками через brew я решил это с помощью:

brew reinstall python2

Скорее всего, нет волшебной пули, поскольку у всех разные сценарии установки. Я пробовал и выше, так что, возможно, это была комбинация нескольких ответов. По умолчанию Brew настроен на python3, поэтому, если вы установили пакет python2, его также необходимо переустановить.

Ответ 16

Вы пытались использовать другой SSH-клиент? Некоторые клиенты SSH имеют специальные встроенные сопоставления клавиш для разных удаленных процессов. Я столкнулся с этим много с emacs.

Какой клиент вы используете? Я бы рекомендовал попробовать Putty и SecureCRT сравнить их поведение.

Ответ 17

Для тех, кто использует conda, установка пакета readline из канала conda-forge устранит проблему:

conda install -c conda-forge readline=6.2

Ответ 18

Как ваша переменная env $TERM устанавливает [a], когда все работает нормально, и [b], когда они этого не делают? Настройки Env часто являются ключом к таким проблемам.

Ответ 19

Попробуйте получить библиотеку key code, запущенную на сервере. Если это не работает, попробуйте загрузить библиотеку с возможностью чтения.

Ответ 20

Я пытался создать 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.

Наконец, проблема решена.

Ответ 21

модуль readline устарел, что приведет к ошибке неверного указателя в последних версиях python при выполнении quit() или exit() в оболочке python. вместо этого pip install gnureadline

Ответ 22

На OS X это работало для меня:

xcode-select --install  # install xcode command line tools (if you haven't already)
brew reinstall python3  # reinstall python3 (perhaps not necessary)
pip3 install gnureadline  # pip install the gnureadline package

Ответ 23

В MacOsx я исправил это, переустановив readline

brew reinstall readline

Ответ 24

Ни один из этих ответов не работал для меня на двух разных версиях Ubuntu. Что сработало для меня, но не совсем верно, так это завершение моего кода на Python при вызове rlwrap (доступно в репозиториях Ubuntu):

rlwrap python mycode.py