Просмотр escape-символов при нажатии клавиш со стрелками в оболочке Python


191

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

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

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

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

>>> impor^[[D

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

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


Я думаю, что это связано с ошибкой сервера. Это вызвано неправильным типом терминала.
эпохальный волк

Я согласен с Cartman ниже, что это проблема readline, а не проблема типа терминала.
Фрэнк

2
easy_install readline, а затем easy_install ipython отлично работает в Mac.
Гнуога

установите anaconda2 или anaconda3 и установите .pystartup, пожалуйста, смотрите ссылку
Leon WANG

1
@LeonWANG дает неверный ответ - не устанавливайте что-то такое большое, как anaconda, только для того, чтобы ваш файл .pystartup заработал. Совершенно ненужно.
JDogg

Ответы:


38

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

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


Спасибо, я согласен, что readline, кажется, проблема. Система имеет /usr/lib/libreadline.so.5, хотя. Там нет / etc / pythonstart.
Фрэнк

1
После некоторого поиска в Google кажется, что python в этой системе, возможно, придется перекомпилировать после установки readline-devel.
Фрэнк

1
Переменная окружения есть PYTHONSTARTUP, нет PYTHONSTART. Не уверен насчет дистрибутивного /etc/pythonstartфайла.
Нед Дейли

1
На самом деле, чтение docs.python.org/2/tutorial/interactive.html дает всю информацию, необходимую для файла pystartup.
chown

7
На OSX с brew все, что мне нужно было сделатьbrew reinstall python3
Ранхиру Джуд Курай

102

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

pip install readline

24
Я должен был установить libncurses-devна своем компьютере с Ubuntu, затем readline установлен правильно.
Амир Элдор

4
Установлено ncurses-develна CentOS, а затем readlineустановлено без проблем. Интерактивная оболочка теперь работает.
однажды

1
yum install ncurses-devel
Алекс Пуннен,

4
не могу pip install readlineна моем компьютере с OS X, каждый раз происходит сбой даже после успешного выполненияbrew install readline
user5359531

10
Мне пришлось установить gnureadlineвместо этого, см. Stackoverflow.com/q/43013060/2846923
Парень с The Hat

82

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

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


Посмотрев и посмотрев, я смог решить проблему с этим предложением. Спасибо!
gl051

Не вызовет ли это проблемы, если что-то вызывает v6, не понимая, что это на самом деле v7?
Адам Барнс

3
У меня была такая же проблема, но вместо этих инструкций я сделал brew update && brew upgrade. Сломал ли это PHP в процессе, еще неизвестно.
Адам Барнс

@AdamBarnes Это также помогло мне. Я также использую pyenv, поэтому обязательно обновлял / переустанавливал нужные мне версии python после обновления всех пакетов homebrew.
funseiki

3
У меня не было libreadline.7.dylib (возможно, потому что я нахожусь на Mojave 10.14.x, а затем обновил XCode 10.2.1), но вместо этого у меня была версия 8. Выполнение ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylibисправило проблему сканирования кодов, но не вернуло историю возврата команды. Хотя в этом случае половина исправления лучше, чем ничего. (Да, я тоже добавил ссылку на 6, без разницы). Приложение: это была / есть только проблема с python2 для меня. python3 отлично работал без ссылок.
Зим

51

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

Есть ли эквивалент, если вы используете систему Python 2.7.10?
user5359531

3
@ user5359531 Я обновил ответ с easy_installопцией
Макс Малыш

Пользователи OSX 10.12 также: stackoverflow.com/questions/7375545/…
ptim

1
Использование easy_installработает для меня, в то время как тот, что с pip не работает.
justhalf

1
Это в сочетании с brew link readline(хотя он уже был связан) исправил это для меня.
Ричард Раст

28

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

это работает, но это означает, что мне нужно добавлять import gnureadlineв начало каждого интерактивного сеанса, который действительно раздражает. Есть ли способ начать это в начале каждого интерактивного сеанса?
Антон Коды

1
@Panchishin попробуйте использовать переменную среды PYTHONSTARTUP, чтобы назвать файл, в котором есть команды Python, выполненные до отображения интерактивного приглашения (т import gnureadline. Е. ). Возможные другие идеи также см. В разделе: запустить интерпретатор командной строки python с автоматически загруженным импортом
user12345

20

Я столкнулся с этой проблемой недавно, и после того, как я много читал о pip install readline(не работает для Mac OSX) и, pip install gnureadlineбудучи неудовлетворенным , теперь это моя установка, которая позволяет использовать клавиши со стрелками в любой консоли Python:

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

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

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

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


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

2
Спасибо за улучшение качества моей жизни! {;-) В Centos 5.5 это yum install readline-devel, и вам не нужно явно указывать readline при перекомпиляции
michela

3
Как мы перекомпилируем Python? Нужно ли мне устанавливать extract python из исходного кода (./configure, make, make install), настраивать virtualenv и снова устанавливать все мои пакеты?
Мухаммед Вакар

14

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

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

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

sudo pip3.6 install gnureadline

:)


1
Я испробовал все другие решения, но это сработало для меня для моего Python 3.6
Umair Ayub

1
Обязательно вызовите import gnureadlineоболочку, чтобы она заработала
Дэвид Шуман

3
Не нужно использовать sudo
Newalp

11

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

7

Это было затронуто после обновления Mac до Высокой Сьерры, это успешно решило это для меня:

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

5

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

yum install readline-devel

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

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

pip3 install readline

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

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


Хороший звонок с подсказкой readline-devel. У меня это работало на машинке Centos6.5, копаясь в python 2.7.8. Я напрямую позвонил pip install readlineбез перекомпиляции Python, и он работал нормально.
Арджун

3

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

  • ням установить 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


CentOS 6.8, Python2.7.12, успех
kkzxak47

3

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

conda install readline

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


2
В моем случае readlineуже установлен, я должен сделать, conda install ncursesчтобы это работало.
whenov

3

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

conda install -c conda-forge readline=6.2

3

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

rlwrap python mycode.py


2

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

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

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

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


2

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

brew reinstall python2

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


1

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

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


Хм, я просто использую команду ssh в терминале (ssh -v говорит OpenSSH_3.9p1, OpenSSL 0.9.7a 19 февраля 2003).
Фрэнк

Попробуйте Putty (это бесплатно) и вернитесь к нам :)
JoshJordan

Хорошо, я только что установил шпаклевку и использовал ее для подключения к машине, но поведение там то же самое.
Фрэнк

:( Тогда определенно проблема на стороне сервера. Я рассмотрю ее и
свяжусь

Использование команды ssh для подключения к какой-либо другой машине работает нормально: у меня нет проблем с клавишами со стрелками. Кажется, это единственная система, которая имеет проблемы.
Фрэнк

1

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


0

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


1
Я только что попробовал некоторые значения переменных TERM: vt102, vt220, ansi, xterm, но ни одно из них не изменило поведение.
Фрэнк

0

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


0

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.