专有库中有代码(例如,下面称为 foo.bar
),我使用它在运行时加载模块,如下所示:
module_name = f"foo.bar.{some_module}"
module = importlib.import_module(module_name)
用户在一些文本配置中提供模块的名称,该模块由库加载。
我想提供一些添加额外功能的模块,所以我想编写一个单独的库来向 foo.bar
包中添加更多模块,并将它们捆绑起来以便通过内部分发PyPi.
所以有人会运行 pip install foo mylibrary
这会安装 foo
和 mylibrary
库,但我想要里面的类 mylibrary
也出现在 foo.bar
命名空间内。
请问这可能吗?
最佳答案
您正在描述命名空间打包的基本用法。
如果 foo.bar
已经是 namespace package , 然后支持第三方包贡献新的子模块。
# in setup.py
from setuptools import setup
setup(
name="mylibrary",
...
namespace_packages=["foo.bar"]
)
安装mylibrary
可以在foo.bar
命名空间中放置新模块。按照 packaging namespace packages 上的指南进行操作获取更多详细信息。
在您的情况下,foo
似乎确实可能已经在使用 namespace 包装,因为问题中显示的动态 importlib 加载表明它旨在与任意命名的“some_module”子模块一起使用,也许由第 3 方“插件”提供。
如果专有库 foo
还不是命名空间包,并且无法将其转换为命名空间包,那么这不可能† 推荐 - 常规包不能不应该在安装时将模块注入(inject)到另一个包的路径中。
†好吧,实际上,这是可能的。例如,安装包 zen-of-numpy 将使 import numpy.this
或 from numpy import this
可用,即使 numpy 本身是不是命名空间包,也不提供 this
子模块。
关于python - 我可以从单独的库向现有包添加模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70384065/