Setuptools 无法使用来自 dependency_links 的链接

Posted

技术标签:

【中文标题】Setuptools 无法使用来自 dependency_links 的链接【英文标题】:Setuptools unable to use link from dependency_links 【发布时间】:2013-06-26 08:23:26 【问题描述】:

我一直在尝试安装配置了以下设置的软件包:

setup(
    packages=find_packages(),
    include_package_data=True,
    install_requires=[
        'Django==1.5.1',
        'xhtml2pdf',
    ],
    dependency_links=[
        'https://github.com/chrisglass/xhtml2pdf/zipball/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947#egg=xhtml2pdf',
    ],
)

但是它从 PyPi 安装 XHTML2PDF 包,而不是使用指定的链接。根据输出(我使用pip install -vvv package.tar.gz 运行安装),它可能无法从链接解析版本(在代码中的// 1),或者我没有指定正确的项目名称(在// 2代码):

Downloading/unpacking xhtml2pdf (from mypackage==1.3)
  Getting page https://pypi.python.org/simple/xhtml2pdf/
  URLs to search for versions for xhtml2pdf (from mypackage==1.3):
  * https://pypi.python.org/simple/xhtml2pdf/
  * https://github.com/chrisglass/xhtml2pdf/zipball/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947#egg=xhtml2pdf
  Getting page https://github.com/chrisglass/xhtml2pdf/zipball/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947
  Analyzing links from page https://pypi.python.org/simple/xhtml2pdf/
    Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.1.tar.gz#md5=9f83a2bcb67858aca9e058761f3bea7b (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.1
    Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.2.tar.gz#md5=d640ccb9470942fd2e6d3ae740c27dc1 (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.2
    Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.1.zip#md5=4ad41c845735ae14da99085311d84c00 (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.1
    Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.4.zip#md5=5f035cd6532bef99b7d35054caaa6ef7 (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.4
    Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.3.zip#md5=32599c74f26f57ebd002765741ec64f7 (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.3
    Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.2.zip#md5=4047a8234eb6b77591d526dcb1f60161 (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.2
    Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.3.tar.gz#md5=13b0d6059b72c994473fddfa7a528451 (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.3
    Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.5.zip#md5=8db99aae8536436a2b7b0b3987197b99 (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.5
    Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.5.tar.gz#md5=1ef268b40c11bf966f7c6c5504299e3e (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.5
    Found link https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.4.tar.gz#md5=36b015a4e2918460711cbc5eebe026ce (from https://pypi.python.org/simple/xhtml2pdf/), version: 0.0.4
  Analyzing links from page https://codeload.github.com/chrisglass/xhtml2pdf/legacy.zip/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947
  Could not parse version from link: https://github.com/chrisglass/xhtml2pdf/zipball/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947#egg=xhtml2pdf  // 1
  Skipping link https://github.com/chrisglass/xhtml2pdf/zipball/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947#egg=xhtml2pdf; wrong project name (not xhtml2pdf)  // 2
  Using version 0.0.5 (newest of versions: 0.0.5, 0.0.5, 0.0.4, 0.0.4, 0.0.3, 0.0.3, 0.0.2, 0.0.2, 0.0.1, 0.0.1)
  Downloading xhtml2pdf-0.0.5.zip (118kB): 
  Downloading from URL https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.5.zip#md5=8db99aae8536436a2b7b0b3987197b99 (from https://pypi.python.org/simple/xhtml2pdf/)
...Downloading xhtml2pdf-0.0.5.zip (118kB): 118kB downloaded

如果我在 install_requiresdependency_links 中将版本号添加到包 (xhtml2pdf-0.0.5) 中,它会找到 Git 链接并且不会抱怨它们,但仍会从 PyPi 安装。

我一直在寻找答案一段时间,但一直未能找到解决方案。我需要 Git 版本,因为它修复了 PyPi 版本还没有的问题。

【问题讨论】:

How can I make setuptools install a package from another source that's also available on pypi with the same version number? 的可能重复项 是的,它是 How can I make setuptools install a package from another source that's also available on pypi with the same version number? 的副本,我已经在我对自己问题的回答中宣布了这一点。 【参考方案1】:

好的,所以我解决了(或破解,取决于你如何看待它)我自己的问题。

代码有两个问题。

第一个问题是链接不正确。虽然我在其他地方看到过这样的格式,但它对我不起作用(无论是使用 setuptools mkvirtualenv mypackage 还是分发 mkvirtualenv --distribute mypackage)。我认为它最后需要 zip 扩展名,并在 Github 上发现您可以使用 https://github.com/user/project/archive/commit.zip 格式下载特定提交。

然后我仍然有一个问题,虽然它现在可以识别链接,但它仍然会选择 PyPi 版本而不是 Github 版本。原因是 Github 上的最后一次提交(发布到 PyPi 之后)仍然与 PyPi 上的最新版本具有相同的版本号。所以事实证明这个问题实际上是How can I make setuptools install a package from another source that's also available on pypi with the same version number?的重复。 为了解决这个问题,我在setup.py 中尝试了以下设置(其中一些已在其他 *** 问题中提及为有效):

install_requires=[],
dependency_links=['https://github.com/chrisglass/xhtml2pdf/archive/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947.zip',],

这根本没有安装 xhtml2pdf。

install_requires=['xhtml2pdf',],
dependency_links=['https://github.com/chrisglass/xhtml2pdf/archive/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947.zip#egg=xhtml2pdf',],

这安装了最新的 PyPi 版本 (0.0.5)。

install_requires=['xhtml2pdf==0.0.5',],
dependency_links=['https://github.com/chrisglass/xhtml2pdf/archive/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947.zip#egg=xhtml2pdf-0.0.5',],

这在 PyPi 中安装了 0.0.5 版本。 如果版本号相同,setuptools 和distribute 会选择PyPi 版本而不是Github 版本实际上是有道理的,因为PyPi 版本应该更稳定。

install_requires=['xhtml2pdf==0.0.6',],
dependency_links=['https://github.com/chrisglass/xhtml2pdf/archive/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947.zip#egg=xhtml2pdf-0.0.6',],

这是从 Github 下载的包(因为 PyPi 上不存在 0.0.6 版本),但是安装时它抱怨版本不匹配,因为包中指定的版本实际上是 0.0.5。

install_requires=['xhtml2pdf<=0.0.6',],
dependency_links=['https://github.com/chrisglass/xhtml2pdf/archive/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947.zip#egg=xhtml2pdf-0.0.6',],

这终于奏效了。 Setuptools(和分发)意识到 Github 版本必须更新,因为这就是我告诉它的。到了安装的时候,它并没有抱怨实际版本是 0.0.5 的事实,因为它仍然满足要求。

您可能会认为这有点像 hack。我对这个解决方案并不完全满意。但我也有一个截止日期,它有效。提醒一句:当版本 0.0.6 实际发布时,我将开始遇到问题。我想正确地固定我的依赖项,因此将来重新安装时不会遇到问题,这不是正确的固定方式。但是我想你可以使用这个文档来摆弄版本号: https://pythonhosted.org/setuptools/setuptools.html#specifying-your-project-s-version。 关键是版本应该(假装)高于 0.0.5,但还有一个数字(带有可选字符),你不希望将来在 PyPi 中显示为一个版本(并且显然低于下一个版本号很可能是(在我的情况下为 0.0.6))。

我希望这对其他人有帮助:)。

注意:我使用requirements.txt 文件,该文件由setup.py 文件处理以提取需求。当您在 requirements.txt 文件中使用 https://github.com/chrisglass/xhtml2pdf/archive/28d12fcaafc4c47b13f1f6f42c2bfb73f90cc947.zip#egg=xhtml2pdf-0.0.6 时,它仍然可以使用 pip install -r requirements.txt 正常安装。

【讨论】:

当上游移动到下一个版本增量时,这势必会中断吗? 是的,我在最后两段中提到了一个警告:“警告:当版本 0.0.6 实际发布时,我将开始遇到问题。我想正确地固定我的依赖项,因此我以后重新安装时不会遇到问题,这不是正确的固定方式。..."

以上是关于Setuptools 无法使用来自 dependency_links 的链接的主要内容,如果未能解决你的问题,请参考以下文章

‘setuptools‘ is a dependency of conda and cannot be removed from

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

无法导入setuptools

由于 setuptools 无法在 conda 中安装 pytorch 是 conda 的依赖项,无法删除

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

带有公司签名 SSL 证书的 Python setuptools