Installing via `setup.py develop` fails - pip works

时间:2016-04-25 08:52:02

标签: python pip setup.py

My python package footools needs html5lib via install_requires in setup.py.

setup.py develop fails

Installing via setup.py develop fails:

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

But direct download works:

bar@workdevel123:~/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

Questions

What is the difference between these two methods?

Why are they different?

What is the correct way to install a dependency in python?

setup.py

The setup.py is not special:

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',
        ],
    },
)

3 个答案:

答案 0 :(得分:10)

python setup.py developsetuptools通常使用easy_install来满足依赖关系,而依赖关系依次使用urllib2pip使用requests。请参阅此处easy_install vs pip pip更现代,除了其他功能外,还可以卸载软件包并符合PEP 438 -- Transitioning to release-file hosting on PyPI的要求。您可以使用python setup.py develop实现与pip install -e src/footools/相同的功能,请注意项目路径是否在当前目录中使用./footools

requests包捆绑了包本身的证书python -c 'import pip;print(pip.download.requests.certs.where())'

setuptools使用系统安装的ca证书python -c 'from setuptools import ssl_support;print(ssl_support.cert_paths)'

您必须使用update-ca-certificates等工具为Ubuntu更新系统安装的ca证书,以自动更新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证书的位置。

答案 1 :(得分:2)

  

setuptools是对Python distutils(Python 2.6及更高版本)的增强功能的集合,它允许开发人员更轻松地构建和分发Python包,尤其是那些依赖于其他包的Python包。

因此,除了其他内容之外,您还可以创建可以上传到Pypi的软件包,然后使用pip进行安装(因此可以解析您的模块)。

那就是说,它们在安装部分实际上不应该有所不同。您正在运行develop模式,因此您可能需要对目录进行一些操作或修复授权错误。

Development Mode中,项目被部署到临时区域(在某种程度上类似于虚拟环境的过程)

  

部署以这样一种方式完成,即在暂存区域中立即可以对项目源进行更改,而无需在每次更改后运行构建或安装步骤。

也意味着该python解释器的所有内容都可用。它可以在以后取消暂存。

我注意到html5lib来自不同的地方:{1}}在一个案例中/pypi/simple/在另一个案例中/pypi/packages/

  

dependency_links   在满足依赖关系时命名要搜索的URL的字符串列表。如果需要安装setup_requires或tests_require指定的包,将使用这些链接。

回到问题我认为这很可能是 ssl 问题,因为在pip它处理得很好(即,很好的警告并且有某种解决方法),但同样的事情不会发生与setuptools。如果未处理的请求中存在错误,那么Couldn't find index page for 'html5lib'可能就是这样。

答案 2 :(得分:1)

这两种方法有什么区别?

除了不同的用户界面之外,作为用户,对您来说没什么特别重要的。他们是乘坐Python套餐管理的历史悠久的火车车程的两站。一路上还有其他人。

他们为什么不同?

在当天,Python并没有提供包管理系统。第三方解决方案填补了空白。它们是由不同的人在不同的时刻设计的。如果你看看其他编程语言,你有时会看到类似的故事;有时你看到更快乐的故事;有时候更悲惨。

在python中安装依赖项的正确方法是什么?

这两种方法在技术上都是正确的。 Pip是一种更现代的方法,根据我的经验,它更受欢迎,也更方便。从Python 3.4及更高版本开始,Pip已经包含在CPython发行版中,并且是正式的首选#39;。所以你可以看到风吹的方向。