尽管格式正确,但Pip会忽略setup.py中的dependency_links

时间:2017-12-04 16:25:35

标签: python pip setup.py

看过去的解决方案如 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

1 个答案:

答案 0 :(得分:3)

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

更新

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

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

容易腻。 : - )

原始答案(已废弃,仅当您要在Github上从koji的repo镜像安装时):

我认为有两种方法可以摆脱这种情况:

分岔

    github上的
  1. fork koji
  2. 编写您自己的setup.py脚本或将其复制到某处(请参阅下面的详细信息),提交并推送
  3. 调整项目dependency_linkssetup.py的网址。
  4. 为了测试,我准备了fork of koji with a setup script;如果我使用其URL而不是上游存储库,则安装成功。我还标记了我自己的"发布"使用koji-1.14.0.post1将版本与来自vanilla的安装脚本区分开来。示例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之前需要额外的开销,直到将安装脚本合并到上游。这包括测试并在每次要同步上游更新时最终在您的分支中调整koji setup.py。我可能会创建一个单独的分支,在那里提交设置脚本sync the fork as usual,然后在fork的主服务器上重新绑定分支,但如果你习惯了另一个更新策略,请坚持下去。

    使用TestPyPI

    中的koji个包

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

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

    此方法的缺点是:

    1. 您根本不知道TestPyPI中的koji包是否可以安装。即使是这样,也无法保证已安装的代码能够按预期工作(尽管应该如此)。当您拥有分支时,您可以自己修复设置脚本 - 如果轮盘文件有错误,您将注定失败。
    2. 定期删除TestPyPI上的软件包。 From the docs
        

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

    3. 最后一点

      您当然可以合并这两种解决方法,并使用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