python - 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 来存档此行为?
解决方案
您可以通过将包拆分为命名空间包来实现此目的。在这种情况下,您的回购将类似于:
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 文档。
推荐阅读
- performance - Spark UI:如何理解 DAG 中的 min/med/max
- javascript - Jquery 菜单图标更改仅在重新加载后有效
- prolog - 不知道怎么说男(X)不等于女(X)
- javascript - 用javaScript画内圈
- python - 数字总和递归python
- android - SQLite 引用另一个表
- scala - 使用数据透视函数时数据不可用时 Spark 数据框缺少列
- javascript - 了解箭头功能 - 为什么这不起作用而这起作用?
- javascript - 如何使用对象数组设置背景图像?
- vb.net - 使用VB.Net计算excel中的工作表数量