Python的setup.py如何定义可选子包及其可选依赖?

11

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

例如,如果我有一个名为项目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"])

修改install_requiresinstall_requires=["ProjectA[Subpackage2]"]后,仅安装项目1的子包1。如果我想要安装项目A和子包1和2,并且满足子包1和2的要求,请问有没有一种方法可以创建一个设置文件(setup.py)来实现这种行为?


3
你需要将项目A拆分为命名空间包。参考示例 - phd
1
我认为这个并没有提供我所需要的功能。我想要一个可以“部分”安装的软件包,这意味着只安装其中的一些子软件包。这应该可以通过在需求文件中命名子软件包来实现... - Bierbarbar
没有办法创建子包而不将它们真正拆分为单独的包。 - phd
4
您所寻找的不可能实现。Extras只是定义要安装的附加软件包列表(即PyPI软件包),除此之外没有任何其他定义。不存在“完整”或“部分”软件包安装的概念;软件包是一个原子实体。@phd在第一条评论中提出的方法是正确的。 - hoefling
1个回答

1
您可以将包拆分为命名空间包来实现此操作。在这种情况下,您的存储库将如下所示:
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
但是,与其他软件包不同的是,如果您安装了这两个命名空间软件包,无论是单独安装还是通过依赖关系安装,它们都可以存在于同一个软件包命名空间中。
也就是说,如果您安装了这两个包,那么您就可以将它们导入为来自同一来源的包:
from project import subpackage_a
from project import subpackage_b

如果您想更详细地了解如何正确设置命名空间包,请查看Python文档


1
这个的 setup.py 会是什么样子? - Will Udstrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接