【问题标题】:How to deal with setup.py overwriting sub-package dependencies如何处理 setup.py 覆盖子包依赖
【发布时间】:2019-11-27 15:44:01
【问题描述】:

我面临的问题是 setuptools 覆盖了子包的依赖要求。

例子:

setup.py

import os
from setuptools import setup

setup(
    name="test",
    version="0.1",
    author="myself",
    author_email="info@example.com",
    description="How to manage dependencies?",
    license="MIT",
    classifiers=[
        "Development Status :: 3 - Alpha"
    ],
    zip_safe=False,
    install_requires=[
        'dependency-injector',
    ]
)

通过python setup.py install安装成功

输出:

(venv) alex@ws:~$ pip freeze
dependency-injector==3.14.12
six==1.12.0
test==0.1

如果您使用以下 setup.py 包括六个作为依赖项(因为您的包中需要它),那么您会遇到问题,因为依赖注入器也需要依赖项,尽管他们已经定义了一个固定版本范围。

import os
from setuptools import setup



setup(
    name="test",
    version="0.1",
    author="myself",
    author_email="info@example.com",
    description="How to manage dependencies?",
    license="MIT",
    classifiers=[
        "Development Status :: 3 - Alpha"
    ],
    zip_safe=False,
    install_requires=[
        'dependency-injector',
        'six'
    ]
)

输出:

error: six 1.13.0 is installed but six<=1.12.0,>=1.7.0 is required by {'dependency-injector'}
(venv) alex@ws:~$ pip freeze
dependency-injector==3.14.12
six==1.13.0
test==0.1

当然,一个可行的解决方案只是重复依赖注入器使用的相同的六个版本范围(请参阅他们的仓库中的 requirements.txt 文件),但我真的很想避免这种重复的依赖定义,因为例如依赖注入器可能会升级六个版本的依赖,因此我还需要更新我的包。所以我会一直尝试模仿他们的要求,这是不好的做法。

我认为实际上唯一干净的解决方案是 setuptools 建立一个依赖树,然后使用匹配所有依赖项要求的版本。 这是现实的吗?在上述情况下,如何实现或推荐的最佳实践是什么?

【问题讨论】:

  • 哪个命令写了这个错误信息?
  • python setup.py install。我只是将它添加到问题中。好问题。谢谢。
  • 我设法重现了它。我想我会以某种方式在 setuptools 问题跟踪器上找到相关的错误,但找不到任何错误。我建议使用pip install . 而不是python3 setup.py install
  • 感谢您的调查。欣赏它。确实,pip install . 解决了这个问题。我刚刚验证了。有趣的。因为昨天我还尝试了一个包含两个要求的 requirements.txt 文件,然后是一个pip install -r requirements.txt,但由于完全相同的原因它失败了。尽管我对 setuptools 和 pip 知之甚少,但现在无法判断它是否是相同的根本原因以及为什么 pip install . 有效。我真的很想至少报告这个错误,以便它在某个时间点得到修复。

标签: python pip setuptools


【解决方案1】:

TL;DR 的答案是 pip 当前没有依赖关系求解器

pip 的问题跟踪器上存在一个关于该主题的持续问题:https://github.com/pypa/pip/issues/988 他们说的是目前pip 的行为是“首先找到的胜利”,因此您的顶级six 依赖关系在dependency-injectorsix 依赖关系之前解决,这就是您获得最新@987654330 的原因@版本安装到底。​​p>

python setup.py installpip install . 的问题上,这两个命令之间似乎存在细微差别。他们内部不使用相同的工具,推荐的命令一般是pip install .

(来源:https://stackoverflow.com/a/15731459/9977650https://github.com/pypa/setuptools/issues/960

【讨论】:

  • 真的,我同意除了前提之外的几乎所有内容......如果我没记错的话,最初的问题不使用 pip install 开头,而只是 设置工具'python setup.py install。并且实际上使用pip install 似乎解决了这个问题,所以 pip 的依赖解析似乎至少在这种情况下已经足够好了。
猜你喜欢
  • 2014-07-21
  • 2015-11-21
  • 2018-11-01
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
相关资源
最近更新 更多