首页 > 解决方案 > Python setup.py 定义具有可选依赖项的可选子包

问题描述

我知道可以在 setup.py 中定义可选依赖项extra-require。现在我问自己是否可以将包标记为可选,以便您可以选择要安装的子包?有没有办法将可选依赖项映射到可选包。

例如,如果我有一个名为 project A 的项目和这个包结构:

Project
   --subPackage 1
   --subPackage 2
   --subPackage 3

我想将子包 2 和 3 标记为可选,以便默认情况下不安装这些包。但是如果一个子包是通过 pip 或项目 B 的要求指定的,它应该与依赖项一起安装。

因此,项目 B 的预期行为应如下所示:

项目 B 的 setup.py:

    setup(
    name='Project B',
    version='0.0.0',
    install_requires=["ProjectA"])

导致仅安装了带有子包 1 的项目 1。但是,如果我将install_requires行更改为install_requires=["ProjectA[Subpackage2]"]. 项目 A 与子包 1 和 2 一起安装,并具有对子包 1 和 2 的给定要求。

这是否可以为项目 A 创建一个 setup.py 来存档此行为?

标签: pythonpython-3.xpipsetup.pypython-packaging

解决方案


您可以通过将包拆分为命名空间包来实现此目的。在这种情况下,您的回购将类似于:

project-subpackage-a/
    setup.py
    project/
        subpackage_a/
            __init__.py

project-subpackage-b/
    setup.py
    project/
        subpackage_b/
            __init__.py

在这里,您有两个完全独立的包,它们有自己的setup.py配置。这意味着您可以使用install_requires并且extra_requires就像使用任何其他软件包一样。

但是,与其他软件包不同,如果您要安装两个命名空间的软件包,无论是单独还是通过要求,它们都可以存在于同一个软件包命名空间中。

也就是说,如果你安装了这两个包,你就可以像它们来自同一个源一样导入它们:

from project import subpackage_a
from project import subpackage_b

有关如何正确设置命名空间包的更多详细信息,请查看python 文档


推荐阅读