Почему пакет Python не устанавливается с моего личного сервера PyPI? - PullRequest
0 голосов
/ 01 марта 2019

Я создал персональный сервер «пакетов» PyPI на коробке Debian 9 / Nginx, чтобы я мог сделать свои сборки сервера детерминированными.Я закрепляю все свои пакеты Python и должен убедиться, что точные версии моих пакетов Python, а также их подзависимости всегда доступны, когда мне нужно перестроить свои серверы электронной коммерции.

Я заполнил этот сервермои необходимые пакеты, использующие пакет pip2pi .Но когда я запускаю команду «pip install» на клиентском сервере для установки своих пакетов, я получаю следующую ошибку:

Looking in indexes: https://packages.example.com/simple
Collecting Django==1.8.4 (from -r requirements.txt (line 2))
Collecting django-extensions==1.5.7 (from -r requirements.txt (line 3))
  Could not find a version that satisfies the requirement django-extensions==1.5.7 (from -r requirements.txt (line 3)) (from versions: )
No matching distribution found for django-extensions==1.5.7 (from -r requirements.txt (line 3))

В моем файле требований содержится около 40 пакетов, так что это простопример того, что происходит.Пакет Django будет установлен, но pip не будет работать с пакетом django-extensions.

Если я запускаю эту команду на любом из моих клиентских серверов, я получаю сообщение об ошибке, показанное выше:

pip install -r requirements.txt

Файл требований выглядит следующим образом:

-i https://packages.example.com/simple
Django==1.8.4
django-extensions==1.5.7
(more packages)

Теперь на моем сервере пакетов корневой каталог пакетов / var / www / packages имеет следующую структуру:

# /var/www/packages:
├── Django-1.8.4-py2.py3-none-any.whl
├── django_extensions-1.5.7-py2.py3-none-any.whl
├── simple
    ├── django
    │   ├── Django-1.8.4-py2.py3-none-any.whl -> ../../Django-1.8.4-py2.py3-none-any.whl
    │   └── index.html
    ├── django-extensions
    │   ├── django-extensions-1.5.7-py2.py3-none-any.whl -> ../../django_extensions-1.5.7-py2.py3-none-any.whl
    │   └── index.html
    ├── index.html

Этот каталогструктура была построена, а пакеты установлены с помощью команды pip2tgz pip2pi:

pip2tgz /var/www/packages/ -r requirements.txt

Вот файл ввода требований, читаемый pip2tgz:

-i https://pypi.org/simple
django==1.8.4
django-extensions=1.5.7
(more packages)

Вот как установлен корневой каталог nginxсервер пакетов:

server {
    ...
    root /var/www/packages;
    ...
}

Брандмауэр на моем сервере пакетов настроен так, чтобы разрешать эхо-запросы, разрешать вход SSH и все соединения http и https.

Я использую Python3.5.3 и pip 19.0.3 на моих клиентских серверах.

Я не уверен, что делаю неправильно.Команда pip выглядит правильно, но мне интересно, правильно ли пакет pip2pi настраивает мои каталоги пакетов?Если я изменю аргумент индекса в файле требований моего клиента на значение по умолчанию, https://pypi.org/simple, все пакеты будут восстановлены без ошибок.

ОБНОВЛЕНИЕ 1

Если я попытаюсьчтобы установить django-расширения из командной строки, а не через файл требований, я все равно получаю сообщение об ошибке:

pip install --index-url=https://packages.example.com/simple/ django-extensions
Looking in indexes: https://packages.example.com/simple/
Collecting django-extensions
  Could not find a version that satisfies the requirement django-extensions (from versions: )
No matching distribution found for django-extensions

При рассмотрении других моих пакетов я вижу здесь образец.Ошибка возникает всякий раз, когда я пытаюсь установить пакет, в котором имя файла колеса содержит подчеркивание ("_"), но в нормализованном имени каталога пакета есть знак переноса ("-") в Python PEP 503.

Например, django-rq терпит неудачу:

directory: simple/django-rq
file: django_rq-0.9.0-py2.py3-none-any.whl

С другой стороны, django-redis-cache не терпит неудачу:

directory: simple/django-redis-cache
file: django-redis-cache-1.6.5.tar.gz

Но еще одно отличие состоит в том, что первыйявляется файлом колеса, в то время как последний является файлом tgz, так что это может объяснить разницу.Я продолжу исследовать это.

ОБНОВЛЕНИЕ 2

По совету Ареса я запустил pip install с подробной опцией:

pip install --verbose --index-url=https://packages.example.com/simple/ django-rq

Вот ошибка:

Created temporary directory: /tmp/pip-ephem-wheel-cache-g_hx5tb1
Created temporary directory: /tmp/pip-req-tracker-1bt5psaw
Created requirements tracker '/tmp/pip-req-tracker-1bt5psaw'
Created temporary directory: /tmp/pip-install-dqvtv6ek
Looking in indexes: https://packages.example.com/simple/
Collecting django-rq
  1 location(s) to search for versions of django-rq:
  * https://packages.example.com/simple/django-rq/
  Getting page https://packages.example.com/simple/django-rq/
  Looking up "https://packages.example.com/simple/django-rq/" in the cache
  Request header has "max_age" as 0, cache bypassed
  Starting new HTTPS connection (1): packages.example.com:443
  https://packages.example.com:443 "GET /simple/django-rq/ HTTP/1.1" 304 0
  Analyzing links from page https://packages.example.com/simple/django-rq/
    Skipping link https://packages.example.com/simple/django-rq/django-rq-0.9.0-py2.py3-none-any.whl (from https://packages.example.com/simple/django-rq/); wrong project name (not django-rq)
Cleaning up...
Removed build tracker '/tmp/pip-req-tracker-1bt5psaw'
Exception information:
Traceback (most recent call last):
  File "/home/flaugher/pip3/venv/lib/python3.5/site-packages/pip/_internal/cli/base_command.py", line 179, in main
    status = self.run(options, args)
  File "/home/flaugher/pip3/venv/lib/python3.5/site-packages/pip/_internal/commands/install.py", line 315, in run
    resolver.resolve(requirement_set)
  File "/home/flaugher/pip3/venv/lib/python3.5/site-packages/pip/_internal/resolve.py", line 131, in resolve
    self._resolve_one(requirement_set, req)
  File "/home/flaugher/pip3/venv/lib/python3.5/site-packages/pip/_internal/resolve.py", line 294, in _resolve_one
    abstract_dist = self._get_abstract_dist_for(req_to_install)
  File "/home/flaugher/pip3/venv/lib/python3.5/site-packages/pip/_internal/resolve.py", line 242, in _get_abstract_dist_for
    self.require_hashes
  File "/home/flaugher/pip3/venv/lib/python3.5/site-packages/pip/_internal/operations/prepare.py", line 269, in prepare_linked_requirement
    req.populate_link(finder, upgrade_allowed, require_hashes)
  File "/home/flaugher/pip3/venv/lib/python3.5/site-packages/pip/_internal/req/req_install.py", line 196, in populate_link
    self.link = finder.find_requirement(self, upgrade)
  File "/home/flaugher/pip3/venv/lib/python3.5/site-packages/pip/_internal/index.py", line 688, in find_requirement
    'No matching distribution found for %s' % req
pip._internal.exceptions.DistributionNotFound: No matching distribution found for django-rq

Ключ выглядит как строка 15, где написано «Пропуск ссылки ... неверное имя проекта (не django-rq)».Я не уверен, почему он пропускает ссылку.

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Похоже, что используемый вами проект pip2pi содержит ошибки и не поддерживается в последнее время, с несколькими открытыми проблемами, касающимися точек / тире в именах дистрибутивов:

Проблема с пакетами с дефисом в имени# 84

Исправить неправильную двоичную нормализацию имени файла для пакетов с дефисами в именах # 67

Изменено dir2pi для использования исходного имени файла в ссылке на файл,# 85

Я рекомендую проверить devpi-server.

0 голосов
/ 04 марта 2019

Похоже, что pypi-server будет лучше всего отвечать моим потребностям.Он успешно устанавливает пакеты, на которых произошел сбой pip2pi, как я описал выше.Он не слишком сложен в настройке и может быть запущен на удаленном сервере через Nginx или Apache.Я нашел эту статью Настройка PyPI-сервера очень полезной (хотя в ней было несколько опечаток).

0 голосов
/ 01 марта 2019

Для моего частного сервера пакетов единственное, что работало, было --extra-index-url:

--extra-index-url https://foo.redacted.com/
Django
my_other_package

Сначала будет проверен pypi, а затем ваш частный сервер.Одна вещь, которая помогла с отладкой, это использовать --verbose, чтобы показать, что происходит с соединением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...