Python setup.py 定义具有可选依赖项的可选子包

Bie*_*bar 8 python pip setup.py python-3.x python-packaging

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

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

Project
   --subPackage 1
   --subPackage 2
   --subPackage 3
Run Code Online (Sandbox Code Playgroud)

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

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

项目 B 的 setup.py:

    setup(
    name='Project B',
    version='0.0.0',
    install_requires=["ProjectA"])
Run Code Online (Sandbox Code Playgroud)

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

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

小智 1

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

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

project-subpackage-b/
    setup.py
    project/
        subpackage_b/
            __init__.py
Run Code Online (Sandbox Code Playgroud)

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

但是,与其他包不同,如果您要单独安装或通过 require 安装这两个命名空间包,则它们可以同时存在于同一包命名空间中。

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

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

project-subpackage-b/
    setup.py
    project/
        subpackage_b/
            __init__.py
Run Code Online (Sandbox Code Playgroud)

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