В следующем примере, который я написал, показано, как
Этот рабочий пример является автономным. Он будет определять простой объект запроса, который использует объект 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);
});
Я подробно рассмотрел это решение здесь .
Похоже, что readline не включен. Проверьте, определена ли переменная PYTHONSTARTUP
, для меня она указывает на /etc/pythonstart
, и этот файл выполняется процессом python до перехода в интерактивный режим, который настраивает обработку readline / history.
Благодаря @chown здесь docs: http://docs.python.org/2/tutorial/interactive.html
Если вы используете Anaconda Python, вы можете исправить это, выполнив:
conda install readline
Работал для меня!
Я пытался создать 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.
Наконец, проблема решена.
Я решил эту проблему, установив пакет readline
:
pip install readline
Как ваша переменная env $ TERM устанавливает [a], когда все работает нормально, и [b], когда они этого не делают? Настройки Env часто являются ключом к таким проблемам.
Был затронут после обновления Mac до High Sierra, это успешно разрешило его для меня:
brew unlink python
xcode-select --install
brew install python
Для тех, кто использует conda, установка пакета readline из канала conda-forge устранит проблему:
conda install -c conda-forge readline=6.2
Вы пробовали использовать другой SSH-клиент? Некоторые клиенты SSH имеют специальные встроенные сопоставления клавиш для разных удаленных процессов. Я столкнулся с этим много с emacs.
Какой клиент вы используете? Я бы рекомендовал попробовать Putty и SecureCRT сравнить их поведение.
Я исправил это, выполнив следующее:
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
Вы вызвали ssh с параметром -t , чтобы передать ssh для размещения виртуального терминала для вас?
На странице man:
-t Принудительное распределение псевдо-tty. Это может быть использовано для выполнения произвольных программ на основе экрана на удаленной машине, что может быть очень полезно, например. при реализации услуг меню. Множество -t-параметров принудительно назначают tty, даже если ssh не имеет локального tty.
blockquote>Кроме того, вам также может быть необходимо установить переменную среды TERM на сервере правильно, как предлагается в другом сообщении.
В 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
Вот шаги, которые работали для меня в 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
Попробуйте получить библиотеку кодовых ключей, запущенную на сервере. Если это не работает, попробуйте загрузить библиотеку с возможностью чтения.
В CentOS я исправляю это с помощью
yum install readline-devel
, а затем перекомпилирует python 3.4.
В OpenSUSE я исправляю это с помощью
pip3 install readline
после ответа Валерио Крини.
Возможно, «pip3 install readline» является общим решением. Не пробовал мой CentOS.
В 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
Проблема решена!
У меня были проблемы с историей оболочки (команды tab / arrows) Python 3.6.x на Ubuntu 16.04 LTS.
Python 3.6.x был установлен из источника.
Что было решено для меня был установлен модуль «gnureadline», как сказано пользователем12345, используя эту командную строку:
sudo pip3.6 install gnureadline
:)
В 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