python 3.6.3: backspace, клавиши со стрелками не работают должным образом [дубликат]

В следующем примере, который я написал, показано, как

  • обрабатывать асинхронные HTTP-вызовы;
  • Подождать ответа от каждого вызова API;
  • Использовать шаблон promise ;
  • Используйте шаблон Promise.All для объединения нескольких HTTP-вызовов;

Этот рабочий пример является автономным. Он будет определять простой объект запроса, который использует объект window XMLHttpRequest для совершения вызовов. Он будет определять простую функцию, чтобы дождаться завершения кучи обещаний.

Контекст. В этом примере запрашивается конечная точка Spotify Web API для поиска объектов playlist для заданного набора строк запроса:

[
 "search?type=playlist&q=%22doom%20metal%22",
 "search?type=playlist&q=Adele"
]

Для каждого элемента новый Promise запустит блок - ExecutionBlock, проанализирует результат, заплатит новый набор обещаний на основе массива результатов, который представляет собой список объектов Spotify user и выполняет новый HTTP-вызов в ExecutionProfileBlock асинхронно.

Затем вы можете увидеть вложенную структуру Promise, которая позволяет вам генерировать множественные и полностью асинхронные вложенные HTTP-вызовы и присоединять результаты к каждому подмножеству вызовов через Promise.all.

NOTE Recent Spotify search API-интерфейсам потребуется указать токен доступа в заголовках запроса:

-H "Authorization: Bearer {your access token}" 

Итак, вы должны запустить следующий пример, вам нужно поместить маркер доступа в заголовки запроса:

var spotifyAccessToken = "YourSpotifyAccessToken";
var console = {
    log: function(s) {
        document.getElementById("console").innerHTML += s + "
" } } // Simple XMLHttpRequest // based on https://davidwalsh.name/xmlhttprequest SimpleRequest = { call: function(what, response) { var request; if (window.XMLHttpRequest) { // Mozilla, Safari, ... request = new XMLHttpRequest(); } else if (window.ActiveXObject) { // Internet Explorer try { request = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) { try { request = new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) {} } } // State changes request.onreadystatechange = function() { if (request.readyState === 4) { // Done if (request.status === 200) { // Complete response(request.responseText) } else response(); } } request.open('GET', what, true); request.setRequestHeader("Authorization", "Bearer " + spotifyAccessToken); request.send(null); } } //PromiseAll var promiseAll = function(items, block, done, fail) { var self = this; var promises = [], index = 0; items.forEach(function(item) { promises.push(function(item, i) { return new Promise(function(resolve, reject) { if (block) { block.apply(this, [item, index, resolve, reject]); } }); }(item, ++index)) }); Promise.all(promises).then(function AcceptHandler(results) { if (done) done(results); }, function ErrorHandler(error) { if (fail) fail(error); }); }; //promiseAll // LP: deferred execution block var ExecutionBlock = function(item, index, resolve, reject) { var url = "https://api.spotify.com/v1/" url += item; console.log( url ) SimpleRequest.call(url, function(result) { if (result) { var profileUrls = JSON.parse(result).playlists.items.map(function(item, index) { return item.owner.href; }) resolve(profileUrls); } else { reject(new Error("call error")); } }) } arr = [ "search?type=playlist&q=%22doom%20metal%22", "search?type=playlist&q=Adele" ] promiseAll(arr, function(item, index, resolve, reject) { console.log("Making request [" + index + "]") ExecutionBlock(item, index, resolve, reject); }, function(results) { // Aggregated results console.log("All profiles received " + results.length); //console.log(JSON.stringify(results[0], null, 2)); ///// promiseall again var ExecutionProfileBlock = function(item, index, resolve, reject) { SimpleRequest.call(item, function(result) { if (result) { var obj = JSON.parse(result); resolve({ name: obj.display_name, followers: obj.followers.total, url: obj.href }); } //result }) } //ExecutionProfileBlock promiseAll(results[0], function(item, index, resolve, reject) { //console.log("Making request [" + index + "] " + item) ExecutionProfileBlock(item, index, resolve, reject); }, function(results) { // aggregated results console.log("All response received " + results.length); console.log(JSON.stringify(results, null, 2)); } , function(error) { // Error console.log(error); }) ///// }, function(error) { // Error console.log(error); });

Я подробно рассмотрел это решение здесь .

114
задан Braiam 8 March 2015 в 20:10
поделиться

18 ответов

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

Благодаря @chown здесь docs: http://docs.python.org/2/tutorial/interactive.html

23
ответ дан Qix 27 August 2018 в 00:22
поделиться

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

conda install readline

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

2
ответ дан Adam Stewart 27 August 2018 в 00:22
поделиться

Я пытался создать 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
ответ дан AeroD 27 August 2018 в 00:22
поделиться

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

pip install readline
60
ответ дан Aleksandr Kovalev 27 August 2018 в 00:22
поделиться

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

0
ответ дан Alex Martelli 27 August 2018 в 00:22
поделиться

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

brew unlink python
xcode-select --install
brew install python
6
ответ дан Big Perm 27 August 2018 в 00:22
поделиться
  1. установить пакет readline-devel.
  2. перекомпилировать python с модулем readline
  3. Bingo!
15
ответ дан Eric Wang 27 August 2018 в 00:22
поделиться

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

conda install -c conda-forge readline=6.2
1
ответ дан Jabba The Hut 27 August 2018 в 00:22
поделиться

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

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

1
ответ дан JoshJordan 27 August 2018 в 00:22
поделиться

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

  • 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 I исправлено это, установив patch: yum install patch

После этого мне удалось успешно запустить pip install readline, который разрешил escape-символы в моей оболочке python.

FYI, Я использую RedHat

3
ответ дан juanpaolo 27 August 2018 в 00:22
поделиться

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

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

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

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

1
ответ дан lothar 27 August 2018 в 00:22
поделиться

В 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
35
ответ дан Max Malysh 27 August 2018 в 00:22
поделиться

Вот шаги, которые работали для меня в ubuntu 12.04 для python 3.3.

1) open teminal и write 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
ответ дан meetar 27 August 2018 в 00:22
поделиться

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

0
ответ дан Niall C. 27 August 2018 в 00:22
поделиться

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

yum install readline-devel

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

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

pip3 install readline

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

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

4
ответ дан peter pan gz 27 August 2018 в 00:22
поделиться

В 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

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

24
ответ дан raptor.zh 27 August 2018 в 00:22
поделиться

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

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

Что было решено для меня был установлен модуль «gnureadline», как сказано пользователем12345, используя эту командную строку:

sudo pip3.6 install gnureadline

:)

3
ответ дан Serza 27 August 2018 в 00:22
поделиться

В OS X, используя python 3.5 и virtualenv

$ pip install gnureadline

В интерпретаторе do:

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
ответ дан user12345 27 August 2018 в 00:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: