Почему Пип игнорирует настроенный репозиторий с вложенными зависимостями? - PullRequest
2 голосов
/ 27 января 2020

Проблема

Допустим, у меня полностью пустая среда Python + Pip + R (pip 19.3.1) на компьютере Linux, и я хочу установить пакет rpy2 с pip. Поскольку я нахожусь за корпоративным брандмауэром, я настраиваю pip для использования частного репозитория.

[global]
index-url = http://private.com/artifactory/api/pypi/PyPI/simple
trusted-host = private.com

Теперь я выполняю pip install rpy2, и я получу следующую ошибку:

Couldn't find index page for 'cffi'
 Download error on https://pypi.python.org/simple/

Итак pip пытается разрешить вложенную зависимость путем поиска и установки cffi из официального репозитория PyPi. Он полностью игнорирует репозиторий, который я настроил.

Когда я запускаю pip install cffi && pip install rpy2 один за другим, все работает как положено.

Вот полный вывод ошибки:

ERROR: Command errored out with exit status 1:
 command: /usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-8vuadu93/rpy2/setup.py'"'"'; __file__='"'"'/tmp/pip-install-8vuadu93/rpy2/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-install-8vuadu93/rpy2/pip-egg-info
     cwd: /tmp/pip-install-8vuadu93/rpy2/
Complete output (25 lines):
Download error on https://pypi.python.org/simple/cffi/: [Errno -2] Name or service not known -- Some packages may not be found!
Couldn't find index page for 'cffi' (maybe misspelled?)
Download error on https://pypi.python.org/simple/: [Errno -2] Name or service not known -- Some packages may not be found!
No local packages or working download links found for cffi>=1.13.1
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/tmp/pip-install-8vuadu93/rpy2/setup.py", line 183, in <module>
    'rinterface_lib/R_API_eventloop.h']}
  File "/usr/lib/python3/dist-packages/setuptools/__init__.py", line 128, in setup
    _install_setup_requires(attrs)
  File "/usr/lib/python3/dist-packages/setuptools/__init__.py", line 123, in _install_setup_requires
    dist.fetch_build_eggs(dist.setup_requires)
  File "/usr/lib/python3/dist-packages/setuptools/dist.py", line 513, in fetch_build_eggs
    replace_conflicting=True,
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 774, in resolve
    replace_conflicting=replace_conflicting
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 1057, in best_match
    return self.obtain(req, installer)
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 1069, in obtain
    return installer(requirement)
  File "/usr/lib/python3/dist-packages/setuptools/dist.py", line 580, in fetch_build_egg
    return cmd.easy_install(req)
  File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 692, in easy_install
    raise DistutilsError(msg)
distutils.errors.DistutilsError: Could not find suitable distribution for Requirement.parse('cffi>=1.13.1')
----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

Вопрос

Это ошибка в Pip, специфическая c проблема с rpy2 или я что-то упустил?

Обновления

Запуск Следующие команды дают мне ту же ошибку:

pip install rpy2 --no-index --find-links http://private.com/artifactory/api/pypi/PyPI/simple
pip install rpy2 --index-url http://private.com/artifactory/api/pypi/PyPI/simple

Я использовал -vvv, и кажется, что проблема возникает где-то внутри setuptools

Решение

Пакет rpy2 использует setuptools, который снова использует easy_install.py. Он также работает с переменной index_url. Но он получает значение не из pip.config, а distutils.cfg.

Я идентифицировал все Python версии, которые я установил с find / -name "distutils". Затем я добавил distutils.cfg со следующим содержимым в каждый из этих каталогов:

[easy_install]
index_url = blablabla

И теперь это работает, я выполняю pip install rpy2 и все отсутствующие требования устанавливаются в один go

1 Ответ

1 голос
/ 27 января 2020

Я полагаю, это может быть вызвано тем фактом, что cffi указан как setup_requires в rpy2 'setup.py. Скорее всего, потому что cffi требуется для сборки самого проекта, прежде чем он может быть установлен . Этот тип build зависимостей не обрабатывается pip напрямую, поэтому его опция index-url не имеет никакого эффекта.

Решение состоит в том, чтобы сообщить setuptools об альтернативном индексе в distutils файле конфигурации

[easy_install]
index_url = https://my.index-mirror.com

Ссылки:

...