Подтвердить что ты не робот

Установка с помощью `setup.py develop` не работает - работает pip

Мой пакет python footools нуждается в html5lib через install_requires в setup.py.

setup.py не работает

Установка с помощью setup.py develop завершается с ошибкой:

cd src/footools/
python setup.py develop

Processing dependencies for footools==2016.205
Searching for html5lib==0.9999999
Reading https://source.example.com/pypi/simple/html5lib/
Download error on https://source.example.com/pypi/simple/html5lib/: 
   [Errno 185090050] _ssl.c:354: error:0B084002:x509 
   certificate routines:X509_load_cert_crl_file:system lib -- 
   Some packages may not be found!
Couldn't find index page for 'html5lib' (maybe misspelled?)

pip works

Но прямые загрузки:

[email protected]:~/src/footools> pip install html5lib==0.9999999
/home/bar/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:79: 
InsecurePlatformWarning: A true SSLContext object is not available. 
This prevents urllib3 from configuring SSL appropriately
and may cause certain SSL connections to fail. 
For more information, see 
https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
Collecting html5lib==0.9999999
/home/bar/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:79: 
    InsecurePlatformWarning: A true SSLContext object is not available. 
    This prevents urllib3 from configuring SSL appropriately and
    may cause certain SSL connections to fail. 
    For more information,
    see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
  Downloading https://source.example.com/pypi/packages/html5lib-0.9999999.tar.gz
Requirement already satisfied (use --upgrade to upgrade):
six in /usr/lib/python2.7/site-packages (from html5lib==0.9999999)
Installing collected packages: html5lib
  Running setup.py install for html5lib
Successfully installed html5lib-0.9999999

Вопросы

В чем разница между этими двумя методами?

Почему они разные?

Каков правильный способ установки зависимостей в python?

setup.py

setup.py не является особенным:

import setuptools

setuptools.setup(
    name='foo',
    version='2016.210',
    long_description=open('README.txt').read(),
    packages=setuptools.find_packages(),
    install_requires=[
        # about twenty packages before this line
        'html5lib==0.9999999'
],
    include_package_data=True,
    entry_points={
        'console_scripts': [
            'foo=foo.utils.bar:main',
        ],
    },
)
4b9b3361

Ответ 1

python setup.py develop или setuptools обычно использует easy_install для удовлетворения зависимостей, которые в свою очередь используют urllib2, тогда как pip использует requests. См. Здесь easy_install vs pip.
pip является более современным и, помимо всего прочего, имеет возможность удалять пакеты и соответствует PEP 438 - Переход на хостинг релизов в PyPI. Вы можете достичь того же, что и python setup.py develop с помощью pip install -e src/footools/, обратите внимание, если путь проекта находится в текущем каталоге, ./footools.

Пакет requests связывает сертификаты ca в самом пакете, python -c 'import pip;print(pip.download.requests.certs.where())'.

setuptools использует установленную систему ca certs python -c 'from setuptools import ssl_support;print(ssl_support.cert_paths)'.

Вам нужно обновить установленные системы ca certs с помощью таких инструментов, как update-ca-certificates, чтобы Ubuntu автоматически обновлял сертификаты ca или загружался из https://curl.haxx.se/docs/caextract.html и установите в один из путей, показанных setuptools, или установите setuptools.ssl_support.cert_paths в последовательность empy, например [], и выполните pip install certifi. Вызов setuptools.ssl_support.find_ca_bundle() покажет расположение сертификатов ca.

Ответ 2

setuptools - это набор улучшений для Python distutils (для Python 2.6 и выше), которые позволяют разработчикам легче создавать и распространять Пакеты Python, особенно те, которые имеют зависимости от других пакетов.

Итак, помимо прочего, вы можете создавать пакеты, которые могут быть загружены на Pypi, а затем установлены с помощью pip (поэтому перенаправляют ваш модуль).

Тем не менее, на самом деле они не должны отличаться друг от друга в части установки. Вы используете режим develop, поэтому, возможно, вам придется немного поиграть с каталогами или исправить ошибку авторизации.

В режиме разработки проект развертывается в промежуточной области (аналогично процессу виртуальной среды)

развертывание выполняется таким образом, что изменения в источнике проекта сразу же доступны в промежуточных областях, без необходимости запуска шага сборки или установки после каждого изменения.

Значение также будет доступно для этого интерпретатора python. Это может быть позже неустановлено.

Я заметил, что html5lib извлекается из разных мест: /pypi/simple/ в одном случае и /pypi/packages/ в другом.

dependency_linksСписок строк именования URL-адресов, которые нужно искать при выполнении зависимостей. Эти ссылки будут использоваться, если необходимо, для установки пакетов, заданных параметрами setup_requires или tests_require.

Вернемся к проблеме. Я думаю, что это, скорее всего, проблема ssl, так как в pip она обрабатывается любезно (т.е. с хорошим предупреждением и существует какое-то обходное решение), но то же самое не происходит с setuptools. Если в запросе, который не обрабатывается, есть ошибка, то из-за этого может возникнуть Couldn't find index page for 'html5lib'.

Ответ 3

В чем разница между этими двумя методами?

Ничего страшного для вас, как пользователя, кроме их разных пользовательских интерфейсов. Это две остановки по живописной исторической поездке на поезде управления пакетами Python. На этом пути были другие.

Почему они разные?

В тот же день Python не поставлял систему управления пакетами. Сторонние решения заполнили пустоту. Они были разработаны разными людьми в разные моменты времени. Если вы смотрите на другие языки программирования, вы иногда видите похожие истории; иногда вы видите более счастливые истории; иногда более трагическим.

Каков правильный способ установки зависимостей в python?

Оба эти метода технически правильны. Пип - более современный метод, и по моему опыту он более популярен и удобен в работе. Начиная с Python 3.4 и выше, Pip был включен в дистрибутив CPython и официально "предпочтен". Таким образом, вы можете видеть, как дует ветер.