Бачити символи втечі при натисканні клавіш зі стрілками в оболонці пітона


191

У оболонках, як інтерактивна оболонка пітона, зазвичай можна використовувати клавіші зі стрілками для переміщення по поточному рядку або отримання попередніх команд (зі стрілкою вгору) тощо.

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

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

де останній символ походить зі стрілки вгору. Або за допомогою стрілки вліво:

>>> impor^[[D

Як я можу це виправити?

У звичайному баші клавіші зі стрілками справно працюють. Дивна поведінка якраз знаходиться в інтерактивній оболонці пітона (або perl тощо).


Я думаю, що це належить до помилки сервера. Це спричинено неправильним типом терміналу.
epochwolf

Я згоден із картчиком нижче, що це проблема читання ліній, а не проблема терміналу.
Френк

2
easy_install readline, а потім easy_install ipython ідеально працює в Mac.
gnuyoga

встановіть anaconda2 або anaconda3 та встановіть .pystartup, будь ласка, дивіться посилання
Leon WANG

1
@LeonWANG дає погану відповідь - не встановлюйте щось таке величезне, як анаконда, просто щоб ваш файл .pystartup працював. Зовсім непотрібне.
jdogg

Відповіді:


38

Схоже, читання рядків не ввімкнено. Перевірте, чи PYTHONSTARTUPвизначена змінна, для мене це вказує/etc/pythonstart і що файл виконується процесом python перед тим, як перейти до інтерактивного, який налаштовує читання / обробку історії.

Завдяки @chown ось такі документи: http://docs.python.org/2/tutorial/interactive.html


Дякую, я погоджуюся з тим, що, здається, проблема у читанні ліній. Однак система має /usr/lib/libreadline.so.5. Немає / etc / pythonstart.
Френк

1
Після деякого googling здається, що python у цій системі, можливо, доведеться перекомпілювати після встановлення readline-devel.
Френк

1
Змінна середовища є PYTHONSTARTUP, ні PYTHONSTART. Не впевнений у /etc/pythonstartфайлі, що стосується розповсюдження .
Нед Дейлі

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

7
На OSX з пивом, що я тільки повинен був зробитиbrew reinstall python3
Ранхіру Джуд Курай

102

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

pip install readline

24
Мені довелося встановити libncurses-devна моїй машині Ubuntu, після чого правильно встановив readline.
Амір Елдор

4
Встановлюється ncurses-develна CentOS, а потім readlineвстановлюється без проблем. Зараз працює інтерактивна оболонка.
one.time

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

4
не вдається pip install readlineна моїй машині OS X, виходить з ладу щоразу навіть після успішного виконанняbrew install readline
user5359531

9
Я повинен був gnureadlineзамість цього встановити , дивіться stackoverflow.com/q/43013060/2846923
Хлопець із капелюхом

82

У OS X у мене різні проблеми.

Коли я використовую оболонку системного пітона, ключі - це не проблема, а проблема у 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, які мені знадобилися після оновлення всіх пакетів домашнього перегляду.
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роботи працює для мене, тоді як той, який має піп, не працює.
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і не задоволений, тепер це моє налаштування, яке дозволяє використовувати клавіші зі стрілками в будь-якій консолі пітона:

  1. встановити gnureadline за допомогою pip install gnureadline

тепер ви можете це робити, import gnureadlineі клавіші зі стрілками повинні працювати, як очікувалося. Щоб автоматично змусити їх працювати, виконайте такі дії:

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

Одне, що не працює, але було зроблено в моїх попередніх налаштуваннях: автоматичне імпортування gnureadline на pdb.set_trace(). Якщо у когось є гарне рішення цієї проблеми, я буду вдячний за коментар.


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

2
Дякую за те, що покращили мою якість життя! {;-) У Centos 5.5 це інсталяція readline-devel, і вам не доведеться чітко вказувати readline в
рекомпіляції

3
Як ми перекомпілюємо Python? Чи потрібно мені встановити витяг python з джерела (./configure, make, make install), встановити virtualenv і знову встановити всі мої пакети?
Мухаммед Вакар

14

У мене виникли проблеми з історією оболонок (команди вкладки / стрілки) Python 3.6.x на Ubuntu 16.04 LTS.

Python 3.6.x був встановлений з джерела.

Для мене вирішено встановити модуль "gnureadline", як сказав користувач12345, використовуючи цей командний рядок:

sudo pip3.6 install gnureadline

:)


1
Я спробував усі інші рішення, але це працювало для мене для мого Python 3.6
Umair

1
обов'язково зателефонуйте import gnureadlineв оболонку, щоб вона працювала
Девід Шуман

3
Не потрібно використовувати
судо

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 на High Sierra вплинуло це, і це вдало вирішило для мене:

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

Я виправив це, зробивши наступне:

  • yum встановити readline-devel
  • pip встановити лінію читання

    • Тут зіткнулася ще одна помилка:

      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успішно запустити, що вирішило символи втечі в моїй оболонці python.

FYI, я використовую RedHat


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

3

Якщо ви використовуєте Anaconda Python, ви можете виправити це за допомогою запуску:

conda install readline

Працювали для мене!


2
У моєму випадку readlineце вже встановлено, я повинен зробити, conda install ncursesщоб він працював.
коли

3

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

conda install -c conda-forge readline=6.2

3

Жодна з цих відповідей не працювала для мене на двох різних версіях Ubuntu. Те, що для мене працювало, але не є справжнім виправленням, - це загортання мого коду python у виклик до rlwrap(доступний у сховищах ubuntu):

rlwrap python mycode.py


2

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

Із чоловічої сторінки:

-t
Виділення псевдо-тти. Це можна використовувати для виконання довільних екранних програм на віддаленій машині, що може бути дуже корисно, наприклад, під час реалізації служб меню. Опції з декількома параметрами змушують розподіляти tty, навіть якщо ssh не має локальних tty.

Крім того, вам може знадобитися правильно встановити змінну середовища TERM на сервері, як було запропоновано в іншій публікації.


2

На Mac OS X Mojave 10.14.6 з різними історичними встановленнями через це brewя вирішив:

brew reinstall python2

Напевно, немає чарівної кулі, якщо кожен має інший сценарій встановлення. Я спробував і вище, і, можливо, це було поєднанням декількох відповідей. Заваріть за замовчуванням python3так, якщо ви встановили python2пакет, його також потрібно перевстановити.


1

Ви спробували використовувати інший клієнт SSH? Деякі клієнти SSH мають спеціальні вбудовані клавіші для різних віддалених процесів. Я наткнувся на цю багато з emacs.

Якого клієнта ви використовуєте? Я рекомендую спробувати Putty та SecureCRT, щоб порівняти їх поведінку.


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

Спробуйте Putty (безкоштовно) та поверніться до нас :)
JoshJordan

Гаразд, я щойно встановив шпаклівку і використав її для підключення до машини, але поведінка там однакова.
Френк

:( Однозначно питання на стороні сервера, тоді я перегляну його і повернуся до вас.
JoshJordan

Використання команди ssh для підключення до якоїсь іншої машини працює нормально: Там у мене немає проблем із клавішами зі стрілками. Здається, це одна особлива система, яка має проблеми.
Френк

1

модуль читання ліній був застарілим, що призведе до помилки помилки вказівника в останніх версіях 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/isissue/126

Тобто потрібно отримати вихідний код попередньої версії readline. Я встановив libreadline 5.2 з apt-get для бібліотеки і отримав вихідний код 5.2 для файлів заголовка. Помістіть їх у / usr / включити.

Нарешті питання було вирішено.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.