如何让 setuptools 安装来自另一个来源的软件包,该软件包在 pypi 上也可以使用相同的版本号?

Posted

技术标签:

【中文标题】如何让 setuptools 安装来自另一个来源的软件包,该软件包在 pypi 上也可以使用相同的版本号?【英文标题】:How can I make setuptools install a package from another source that's also available on pypi with the same version number? 【发布时间】:2012-06-17 10:17:25 【问题描述】:

这是一个与How can I make setuptools install a package that's not on PyPI? 类似的问题,但不一样。

由于我想使用某些包的分叉版本,setuptools 忽略依赖链接(因为它具有相同的版本号)。

有没有办法强制使用dependency_links中的链接?或者是更改分叉存储库中版本号的唯一方法?

requires = [
    ...
    'pyScss==1.1.3'
    ...

dependencies = [
    'https://github.com/nadavshatz/pyScss/zipball/master#egg=pyScss-1.1.3'
]

更新

很奇怪,如果这个包是所需列表中唯一的一个,但它还没有安装,它显然可以工作。如果有另一个丢失的包,它会从 pypi 下载它。

【问题讨论】:

@IlyaBaryshev,抱歉,我只使用我在更新中描述的解决方法。安装/更新所有包,然后卸载这个特定的包,然后它是唯一丢失的包 - 在这种情况下,它将从依赖项中获取链接 我正在创作一个包,所以它不是一个选项。我正在考虑出售我的包中的所有依赖项,考虑到错误的 setuptools 行为,这似乎是唯一的选择。 这可能是您的问题的解决方案:***.com/a/17442663/368102? 【参考方案1】:

我相信您可以按照该问题中的说明使用dependency_links

from setuptools import setup

setup(name = 'mypkg',
    version = '0.0.1',
    description = 'Foo',
    author = 'bar',
    author_email = 'bar@example.com',
      install_requires = ['pyScss==1.1.3'],
      dependency_links = [
      'https://github.com/nadavshatz/pyScss/zipball/master#egg=pyScss-1.1.3'
      ]
    )

使用python setup.py develop测试

你可能想重命名鸡蛋以强调它是一个叉子http://www.python.org/dev/peps/pep-0386/

在 setup.py 之外,您可以使用 requirements.txtpip 在本地强制执行此操作。虽然这不会使您的软件包依赖于 fork,但您可以轻松地将其记录为安装方式。

$ cat requirements.txt
https://github.com/nadavshatz/pyScss/zipball/master#egg=pyScss-1.1.3
$ pip install -r requirements.txt

【讨论】:

实际上这就是我正在做的...在setup 调用中,我通过install_requires = requiresdependency_links = dependencies。这与您的代码基本相同。【参考方案2】:

我最终做了与***.com/a/17442663/368102 中的答案非常相似的事情。

我需要一个 requests-file github 包,它与 PyPi 中的另一个 requests-file 包发生名称冲突。它们都有 1.0 版本,而 PyPi 版本有一些更高的版本。

ias_tools/setup.py 中的解决方法如下所示:

setup(
    ...
    install_requires=[
        'requests-file<=99.99',
    ],
    dependency_links=[
        'https://github.com/jvantuyl/requests-file/archive/b0a7b34af6e287e07a96bc7e89bac3bc855323ae.zip#egg=requests-file-99.99'
    ]
)

就我而言,我使用的是pip,所以我也必须使用--process-dependency-links

% pip install --process-dependency-links ./ias_tools
You are using pip version 6.0.6, however version 6.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Processing ./ias_tools
  DEPRECATION: Dependency Links processing has been deprecated and will be removed in a future release.
Collecting requests-file<=99.99 (from ias-tools==0.1)
  Downloading https://github.com/jvantuyl/requests-file/archive/b0a7b34af6e287e07a96bc7e89bac3bc855323ae.zip
Requirement already satisfied (use --upgrade to upgrade): requests>=1.1.0 in ./venv/lib/python2.7/site-packages (from requests-file<=99.99->ias-tools==0.1)
Installing collected packages: ias-tools, requests-file
  Running setup.py install for ias-tools
  Running setup.py install for requests-file
Successfully installed ias-tools-0.1 requests-file-1.0

我不太担心弃用通知,因为a pull request was submitted to pip 弃用了弃用通知(在discussion about it 之后)。

【讨论】:

我的构建命令是pip install --upgrade -e .,我还需要添加--process-dependency-links。感谢您提供该信息。

以上是关于如何让 setuptools 安装来自另一个来源的软件包,该软件包在 pypi 上也可以使用相同的版本号?的主要内容,如果未能解决你的问题,请参考以下文章

一个简单的 Hello World setuptools 包并使用 pip 安装它

Setuptools 无法使用来自 dependency_links 的链接

Windows+Linux安装Python工具setuptools

如何判断是不是安装了 Python setuptools?

如何将安装后脚本添加到 easy_install / setuptools / distutils?

为啥我的 CORS 配置没有导致服务器过滤传入的请求?如何让服务器只接受来自特定来源的请求?