Просмотр escape-символов при нажатии клавиш со стрелками в оболочке Python - PullRequest
160 голосов
/ 21 мая 2009

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

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

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

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

>>> impor^[[D

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

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

Ответы [ 20 ]

5 голосов
/ 25 января 2015

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

yum install readline-devel

и затем перекомпилировать python 3.4.

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

pip3 install readline

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

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

3 голосов
/ 15 января 2016

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

  • 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.

К вашему сведению, я использую RedHat

3 голосов
/ 11 февраля 2017

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

conda install readline

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

2 голосов
/ 21 мая 2009

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

со страницы руководства:

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

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

1 голос
/ 21 мая 2009

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

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

1 голос
/ 20 сентября 2017

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

conda install -c conda-forge readline=6.2
0 голосов
/ 28 ноября 2018

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

0 голосов
/ 26 июня 2013

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

0 голосов
/ 13 мая 2015

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

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

0 голосов
/ 21 мая 2009

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

...