繁体   English   中英

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

[英]Python setup.py define optional subpackages with optional dependencies

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

例如,如果我有一个名为项目 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 以存档此行为?

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

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

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

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

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

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

from project import subpackage_a
from project import subpackage_b

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM