【问题标题】:Pip ignores dependency_links in setup.py despite proper format尽管格式正确,Pip 仍忽略 setup.py 中的dependency_links
【发布时间】:2018-05-18 04:14:42
【问题描述】:

寻找过去的解决方案,例如 pip ignores dependency_links in setup.py,这个配置应该可以了。

我的 setup.py 的相关内容

packages=find_packages(),
dependency_links=['http://github.com/koji-project/koji/tarball/master#egg=koji'],
install_requires=['jira', 'PyYAML', 'requests', 'psycopg2',
                  'elasticsearch', 'beanbag', 'pyzabbix', 'enum34',
                  'beautifulsoup4', 'pytz', 'koji'],
tests_require=['flake8', 'autopep8', 'mock'],
include_package_data=True,
cmdclass={'test': setupTestRequirements}

我唯一能想到的是我的网址无效。我不明白为什么会这样,因为它是 1.14.0 版本。

在运行pip install . 时我明白了。

Could not find a version that satisfies the requirement koji (from MARs==0.17.10) (from versions: ) No matching distribution found for koji (from MARs==0.17.10)

在运行 python setup.py develop --user 时,输出没有提到 Koji

【问题讨论】:

  • 不是pip 方面的专家,但您是否尝试过没有koji 部分的egg=?例如git@github.com:koji-project/koji.git#egg=1.14.0
  • 不起作用,从我的链接答案看来,它似乎需要egg={repo name}-{version}
  • 我刚试过你的setup.py(在删除cmdclass之后)并运行python setup.py develop --user并提到koji(虽然它没有成功下载任何东西)
  • python 版本?我的是2.7.12pip 9.0.1 但我想这可能不相关。
  • @GrzegorzOledzki python 2.7.14, pip 9.0.1。有趣的是,我可以通过仅排除 setup 中的 name kwarg 来获得下载但找不到安装脚本的输出。

标签: python pip setup.py


【解决方案1】:

您的配置是正确的。然而,问题出在其他地方。看看koji repo on github:该项目没有setup.py 提交。只要没有setup.py 脚本,pipsetuptools(通过setup.py install/setup.py develop)都无法安装您的项目,因为它们将无法安装koji 依赖项因为它根本不是有效的 python 包。

更新:

github 上koji repo 的问题在于它只是位于Fedora Pagure 上的实际开发 repo 的镜像,并且没有与上游同步。所以正确的答案是使用真正的开发仓​​库而不是github镜像:

dependency_links=['git+https://pagure.io/koji.git#egg=koji-1.14.0']

简单易懂。 :-)

原始答案(已过时,仅当您想从 Github 上的kojis repo 镜像安装时):

我看到了两种摆脱这种情况的方法:

分叉

  1. 在 github 上 fork koji
  2. 编写您自己的setup.py 脚本或将其复制到某处(有关详细信息,请参阅下文),提交并推送
  3. 在您项目的setup.py 中调整dependency_links 中的URL。

为了测试,我准备了fork of koji with a setup script;如果我使用它的 URL 而不是上游存储库,则安装成功。我还用koji-1.14.0.post1 标记了我自己的“发布”,以区分带有安装脚本的版本和普通版本。带有新依赖项的示例 setup.py

from setuptools import setup, find_packages

setup(
    name='spam',
    version='0.1',
    author='nobody',
    author_email='nobody@nowhere.com',
    url='www.example.com',
    packages=[],
    dependency_links=['https://github.com/hoefling/koji/tarball/master#egg=koji-1.14.0.post1'],
    install_requires=['koji==1.14.0.post1'],
)

使用pip 测试安装结果:

$ pip install . --process-dependency-links
Obtaining file:///home/hoefling/python/spam
  DEPRECATION: Dependency Links processing has been deprecated and will be removed in a future release.
Collecting koji==1.14.0.post1 (from spam==0.1)
  Downloading https://github.com/hoefling/koji/tarball/master (1.4MB)
    100% |████████████████████████████████| 1.4MB 759kB/s 
Collecting pyOpenSSL (from koji==1.14.0.post1->spam==0.1)
  Using cached pyOpenSSL-17.5.0-py2.py3-none-any.whl
Collecting pycurl (from koji==1.14.0.post1->spam==0.1)
  Using cached pycurl-7.43.0.1.tar.gz
...
Installing collected packages: six, idna, asn1crypto, pycparser, cffi, 
cryptography, pyOpenSSL, pycurl, python-dateutil, chardet, certifi, 
urllib3, requests, pykerberos, requests-kerberos, rpm-py-installer, 
koji, spam
  Running setup.py install for rpm-py-installer ... done
  Running setup.py install for koji ... done
  Running setup.py install for spam ... done
Successfully installed asn1crypto-0.23.0 certifi-2017.11.5 cffi-1.11.2 
chardet-3.0.4 cryptography-2.1.4 idna-2.6 koji-1.14.0.post1 pyOpenSSL-17.5.0 
pycparser-2.18 pycurl-7.43.0.1 pykerberos-1.1.14 python-dateutil-2.6.1 
requests-2.18.4 requests-kerberos-0.11.0 rpm-py-installer-0.5.0 six-1.11.0 
spam-0.1 urllib3-1.22

安装的包看起来不错:

$ pip list
Package           Version     
----------------- ------------
asn1crypto        0.23.0      
certifi           2017.11.5   
cffi              1.11.2      
chardet           3.0.4       
cryptography      2.1.4       
idna              2.6         
koji              1.14.0.post1
pip               9.0.1       
pycparser         2.18        
pycurl            7.43.0.1    
pykerberos        1.1.14      
pyOpenSSL         17.5.0      
python-dateutil   2.6.1       
requests          2.18.4      
requests-kerberos 0.11.0      
rpm-py-installer  0.5.0       
rpm-python        4.11.3      
setuptools        38.2.4      
six               1.11.0      
spam              0.1         
urllib3           1.22        
wheel             0.30.0

这种方法的缺点是在将设置脚本合并到上游之前,您在维护分叉时会产生额外的开销。这包括每次您想要同步上游更新时在您的 fork 中测试并最终调整 kojisetup.py。我可能会创建一个单独的分支,并在那里提交设置脚本sync the fork as usual,然后在 fork 的 master 之上重新设置分支,但如果您习惯了另一种更新策略,请坚持下去。

使用来自TestPyPIkoji

实际上,我在 TestPyPI 上找到了一些最新版本的 koji 轮子。这也是我获得上述 fork 的 setup.py 的地方 - 我下载了源 tar,解压缩并复制了安装脚本。这意味着koji 开发人员正在考虑通过 PyPI 分发项目并正在处理设置脚本,但尚未提交。当他们正在处理它时,您可以使用测试包索引作为解决方法。这样,您就不会从源代码构建包,而是使用 koji devs 构建和上传的轮子:

setup(
    ...
    dependency_links=['https://testpypi.python.org/pypi/koji'],
    install_requires=['koji'],
)

这种方法的缺点是:

  1. 您根本不知道来自 TestPyPI 的 koji 包是否可安装。即使是这样,也不能保证安装的代码会按预期工作(尽管应该)。当你有 fork 时,你总是可以自己修复设置脚本 - 如果 wheel 文件有错误,你注定要失败。
  2. TestPyPI 上的包会定期删除。 From the docs:

    注意:TestPyPI 的数据库可能会定期修剪,因此删除用户帐户的情况并不少见。

最后一点

您当然可以结合使用这两种解决方法并在dependency_links 中使用这两个网址:

setup(
    ...
    dependency_links=[
        'https://testpypi.python.org/pypi/koji',
        'https://github.com/hoefling/tarball/master#egg=koji-1.14.0.post1',
    ],
    install_requires=['koji'],
)

这样,如果在 TestPyPI 上找不到包,它将从你的 fork 构建。

最后注 2

您可能需要安装一些额外的系统包;至少对于我的系统CentOS Linux release 7.3.1611 (Core),我必须安装curl-devel 才能满足pycurl

【讨论】:

  • 很好的描述。是否应该向 koji 库报告 PR/错误?
  • @GrzegorzOledzki 谢谢! :-) 我不知道 Fedora 开发人员是否会将其视为一个问题,但绝对值得一试。
  • @GrzegorzOledzki 实际上,安装脚本存在于upstream repo on Fedora Pagure 中。妈的,我应该马上去看的!似乎他们的 git mirror 已经过时了,所以真正的问题是同步两个 repos。
  • 那么问题来了,不使用Github镜像,你能用pippagure.io获取源码吗?
  • @GrzegorzOledzki 当然可以,我刚刚用一个例子更新了答案......
猜你喜欢
  • 2012-09-13
  • 1970-01-01
  • 2018-11-03
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多