Установка с помощью `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',
],
},
)
Ответы
Ответ 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 и официально "предпочтен". Таким образом, вы можете видеть, как дует ветер.