python - 我可以从单独的库向现有包添加模块吗?

标签 python

专有库中有代码(例如,下面称为 foo.bar),我使用它在运行时加载模块,如下所示:

module_name = f"foo.bar.{some_module}"
module = importlib.import_module(module_name)

用户在一些文本配置中提供模块的名称,该模块由库加载。

我想提供一些添加额外功能的模块,所以我想编写一个单独的库来向 foo.bar 包中添加更多模块,并将它们捆绑起来以便通过内部分发PyPi.

所以有人会运行 pip install foo mylibrary 这会安装 foomylibrary 库,但我想要里面的类 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.thisfrom numpy import this 可用,即使 numpy 本身是不是命名空间包,也不提供 this 子模块。

关于python - 我可以从单独的库向现有包添加模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70384065/

相关文章:

python - 使用 Gunicorn 和 nginx 部署 Django 项目

python - 在 Grails 应用程序后面使用 Python 或 C

python - 扭曲的 python - tac 还是 py?

python - Healpy 在 Windows 上安装 Python 3.4

python - 无法使用openCV从图像中提取每个文本

python - 在 centos 中安装 python 库的问题

python - Numpy 温度计编码

python - 生成器和列表返回不同的结果

python - nltk 词语料库不包含 "okay"?

python - 如何在 Gtk3 中获取 DrawingArea 窗口句柄?