【问题标题】:Python setup.py define optional subpackages with optional dependenciesPython setup.py 定义具有可选依赖项的可选子包
【发布时间】:2018-12-17 03:26:53
【问题描述】:

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

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

【问题讨论】:

  • 您需要将项目A拆分为namespace packages。请参阅sample
  • 我认为这不提供我正在寻找的功能。我想要一个可以“部分”安装的包,这意味着只安装一些子包。这应该可以通过在需求文件中命名子包来实现...
  • 如果不将子包真正拆分为单独的包,就无法创建子包。
  • 您寻找的东西是不可能的。 Extras 仅定义要​​安装的附加包列表(在 PyPI 包的意义上),除此之外不定义任何内容。没有“完整”或“部分”软件包安装之类的东西;包是一个原子实体。 @phd 在第一条评论中建议的是正确的方法。

标签: python python-3.x pip setup.py python-packaging


【解决方案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

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

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

from project import subpackage_a
from project import subpackage_b

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

【讨论】:

    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多