python-3.x - 如何在 setup.py 中指定递归依赖?

标签 python-3.x pip setuptools setup.py

我在使用 pip 理解和实现 Python 打包的一些细节时遇到困难和 setuptools .

假设我有三个项目,AB 以及 C,每个项目都是自己的包并托管在自己的代码库中。它们也相互依赖,即 AB 导入,BC 导入。每个包都有一组直接依赖项(即直接导入其他包)和一组间接依赖项(即由直接依赖包导入的包)。这些依赖关系是一个图,而不是树。

对于包 A,应该 setup.py只包含直接依赖的包?包 B 也一样吗?然后,当我 pip install C 时,我注意到安装了 B,但没有安装 A。我想那是因为 AC 的间接依赖项。

我不太喜欢存储 pip freeze 的想法在每个包中(不灵活且冲突织机),但似乎 pip 没有递归地解析依赖关系图(参见 here )。 snakebasket项目试图解决这个问题,但现在已经过时了; dependency-links选项已被弃用。

处理此问题的正确和推荐方法是什么?

附录 我忘了提到没有的包(ABC ) 可通过官方 PyPi 获得 repo ,但住在私有(private) Github repo 。因此,例如 B 的 setup.py 包含

install_requires=(
    …,
    A==1.0.0,
    …,
    )

dependency_links=[                                                                                        
    f"https://{github_token}@github.com/repo/A/archive/v1.0.0.tar.gz#egg=A-1.0.0",
    ],

C 包含一个类似的包 B 设置。

最佳答案

How to specify recursive dependencies in setup.py?

不要。

What is the proper and recommended way of handling this?

setup.py 应在 install_requires=[...] 下列出直接 依赖项。不要列出传递依赖项。并且不要在此处固定依赖项(尽管在某些情况下,您可能希望指定上限或下限以确保收集到兼容版本)。

When I then pip install C I noticed that B gets installed, but not A.

然后 B 没有正确指定对 A 的依赖。再次检查 B 的元数据。

pip 有时无法正确解析依赖树,是真的,并且有一个 open issue about that自 2013 年以来,但您不会在简单的 C -> B -> 依赖图中看到它,只会在一些更病态的情况下看到它。

查看我的项目 johnnydep呈现 dep 树并指示您在包元数据中缺少“分支”的位置。

关于python-3.x - 如何在 setup.py 中指定递归依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55872992/

相关文章:

python - 在 python 中绘制点集

installation - Tensorflow安装错误: not a supported wheel on this platform

python - 在 Spyder 中安装 pip

python - 在 python 包中使用脚本作为库和可执行文件

python - 将 argparse 与 Setuptools entry_points 一起使用

python - 尝试使用 Python 3.7.2 pip 安装包会导致 TSL/SSL 错误

Python格式电话号码

python - 错误 : error in 'egg_base' option: 'src' does not exist or is not a directory

python - 我们可以在 python 3.3 及更高版本中用 find_namespace_packages 替换 find_packages 并删除空的 init.py 文件吗?

python - 如何使用列表/字典理解在 Python 中获取唯一值