pip может найти пакет, но установка не удалась с ошибкой
У меня есть локальный сервер Pypi, куда я загрузил cffi
пакет.
Когда я пытаюсь найти, он возвращает пакет.
$ pip search -i https://localhost --trusted-host localhost cffi
cffi (1.11.4) - 1.11.4
Но при попытке установки выдает ошибку.
$ pip install -i https://localhost --trusted-host localhost cffi==1.11.4
Collecting cffi==1.11.4
Could not find a version that satisfies the requirement cffi==1.11.4 (from versions: )
No matching distribution found for cffi==1.11.4
я бегу pypi
сервер под apache
веб-сервер для обработки https
запросы на centos
,
Я проверяю журнал apache /var/log/httpd/ssl_access_log
, за install
команда. Его возвращение 200
за GET Call
,
127.0.0.1 - - [25/Jan/2018:16:46:23 +0000] "GET /cffi/ HTTP/1.1" 303 -
127.0.0.1 - - [25/Jan/2018:16:46:23 +0000] "GET /simple/cffi/ HTTP/1.1" 200 339
Я снова проверяю журнал. За celery
это работает, после этого для cffi
это терпит неудачу.
127.0.0.1 - - [25/Jan/2018:16:50:58 +0000] "GET /celery/ HTTP/1.1" 303 -
127.0.0.1 - - [25/Jan/2018:16:50:58 +0000] "GET /simple/celery/ HTTP/1.1" 200 321
127.0.0.1 - - [25/Jan/2018:16:50:58 +0000] "GET /packages/celery-4.0.2-py2.py3-none-any.whl HTTP/1.1" 200 396437
127.0.0.1 - - [25/Jan/2018:16:50:59 +0000] "GET /cffi/ HTTP/1.1" 303 -
127.0.0.1 - - [25/Jan/2018:16:50:59 +0000] "GET /simple/cffi/ HTTP/1.1" 200 339
Проблема в том, что для cffi
его не перенаправить на /packages/cffi-1.11.4-cp35-cp35m-manylinux1_x86_64.whl
, Пока в celery
его идет к /packages/celery*
после GET /simple/celery/
,
Я пытался curl
, чтобы проверить, есть ли изменение в ответе между этими 2 пакетами, но нет никакой разницы.
$ curl -k https://localhost/simple/celery/ -i
HTTP/1.1 200 OK
Date: Thu, 25 Jan 2018 16:59:27 GMT
Server: Apache/2.2.15 (CentOS)
Content-Length: 321
Connection: close
Content-Type: text/html; charset=UTF-8
<html>
<head>
<title>Links for celery</title>
</head>
<body>
<h1>Links for celery</h1>
<a href="/packages/celery-4.0.2-py2.py3-none-any.whl#md5=3ff97b53107b491baeb42f662be14a06">celery-4.0.2-py2.py3-none-any.whl</a><br>
</body>
</html>
$ curl -k https://localhost/simple/cffi/ -i
HTTP/1.1 200 OK
Date: Thu, 25 Jan 2018 16:59:29 GMT
Server: Apache/2.2.15 (CentOS)
Content-Length: 339
Connection: close
Content-Type: text/html; charset=UTF-8
<html>
<head>
<title>Links for cffi</title>
</head>
<body>
<h1>Links for cffi</h1>
<a href="/packages/cffi-1.11.4-cp35-cp35m-manylinux1_x86_64.whl#md5=c9478cf605b4eb2755fa322cc2bf3ddf">cffi-1.11.4-cp35-cp35m-manylinux1_x86_64.whl</a><br>
</body>
</html>
1 ответ
Две наиболее распространенные проблемы, возникающие при решении этой проблемы, - это несоответствие платформы или несоответствие версии Python.
проверка версии Python
Проверьте, какая версия Python по умолчанию pip
относится к - это python3.5
"s pip
?
$ pip -V | grep -o "(.*)"
даст вам информацию. Если по умолчанию pip
ссылается на какую-то другую версию Python, вызвать python3.5
"s pip
непосредственно с pip3.5
:
$ pip3.5 install -i https://localhost --trusted-host localhost cffi==1.11.4
проверка платформы
Попробуйте явно загрузить cffi
пакет для manylinux1_x86_64
платформа - руль будет качать?
$ pip download cffi --only-binary=:all: --platform manylinux1_x86_64 -i https://localhost --trusted-host localhost
Если загрузка прошла успешно, у вас есть несоответствие платформы на вашей целевой машине. Проверьте, какая платформа распознается pip
:
$ python3.5 -c "import pip; print(pip.pep425tags.get_platform())"
Проверка ABI
Менее распространенная проблема - несоответствие ABI: вы можете проверить ABI вашей платформы с помощью
$ python3.5 -c "import pip; print(pip.pep425tags.get_abi_tag())"
Эта строка должна совпадать с префиксом в имени колеса перед тегом платформы, поэтому в вашем случае ваш ABI должен быть cp35m
,
Если вы получите macosx_10_13_x86_64
тег платформы, это означает, что у вас MacOS High Sierra. На вашем локальном сервере PyPI вы загрузили cffi
колесо, которое можно установить только на Linux (manylinux
рулевое колесо). Вы не сможете установить его на MacOS High Sierra. Дело в том, cffi
пакет отправляет код, частично написанный на C и скомпилированный только для целевой платформы. У вас есть три возможности решить эту проблему:
- Самое простое решение: скачать
macosx_10_13_x86_64
колесо от PyPI и загрузить его на свой локальный сервер вместе сmanylinux1
рулевое колесо. Теперь клиент linux получит колесо, скомпилированное для linux, и вы получите колесо, скомпилированное для MacOS при запускеpip install cffi
, - Решение "сделай сам": загрузите установщик исходного кода из PyPI и загрузите его на свой локальный сервер вместе с
manylinux1
рулевое колесо. Теперь клиент linux получит скомпилированное колесо, а клиенты MacOS и Windows получат tar с исходным кодом, где они будут вынуждены локально скомпилировать содержащийся C-код - если ОС не предоставляет нужные инструменты, установка завершится неудачно. - Сконфигурируйте локальный сервер для прокси PyPI: если пакет запрошен, но не найден на вашем локальном сервере, он передает запрос в
pypi.python.org
и если пакет найден в общедоступном хранилище, он загружается и проходит через ваш локальный сервер, как если бы он был найден там. Не уверен, однако, если ваш сервер поддерживает эту функцию. Мы используемdevpi
где достаточно сказать вашему индексу, что он должен иметьroot/pypi
среди его основ:devpi index -m user/index bases=root/pypi
,
Обратите внимание, что эти решения не являются взаимоисключающими: вы можете объединить 1 с 2 (клиенты Linux получат manylinux1
колеса, высокая Сьерра получает macos_10_13
колесо, остальные получают исходный смолу) и даже 1, 2 и 3 всего вместе. Все зависит от того, что вы хотите / нужно / можете загружать и поддерживать на локальном сервере.