python - 从多个 python 模块访问公共属性
问题描述
我不完全确定标题是否适合这个问题,但这是我想要实现的目标:我有一个这样的目录结构:
models/
modelA/
src/
modelA.py
__init__.py
modelB/
src/
modelB.py
__init__.py
scripts/
sandbox.py
每个模型文件夹中的__init__.py
文件包含以下代码:
from .src.modelA import modelA as Model
MODEL_NAME = "modelA"
MODEL_VERSION = "1.0.0"
INPUT_FEATURES_TYPES = [ ("feature1", "1.0.0"), ("feature2", "1.0.0") ]
INPUT_TYPE = "images"
现在,在 sandbox.py 中,我希望能够通过解析每个__init__.py
文件来创建一个包含模型列表及其属性的数组。我想要达到的最终结果是这样的:
[{
name : "modelA",
version: "1.0.0",
inputFeat : [("feature1", "1.0.0"), ("feature2", "1.0.0")],
inputType : "images"
},
{
name : "modelB",
version: "1.0.0",
inputFeat : [("feature1", "1.0.0"), ("feature2", "1.0.0")],
inputType : "text"
},
...
]
有什么简单的方法可以做到这一点?还是我必须创建和更新列出所有这些详细信息的静态文件?我的意图是我可以在未来继续添加新模型,并且仍然能够在需要时轻松提取此列表。
解决方案
您可以使用pkgutil迭代子模块:
import pkgutil
import importlib
for importer, modname, ispkg in pkgutil.iter_modules('/path/to/models', '.src.'):
module = importlib.import_module(modname)
from module import MODEL_NAME, MODEL_VERSION, INPUT_FEATURES_TYPES, INPUT_TYPE
然后你可以创建你的字典。
我没有测试之前的代码,但它可以在我自己的使用模块名称的包上运行:
pkgutil.iter_modules(module.__path__, module.__name__ + '.')
推荐阅读
- c - 杀死任一线程并退出进程
- sql - 带有条件过滤器的 Oracle 查询
- python - 即使在导入 types-python-dateutil 之后,mypy 也找不到 python-dateutil
- c# - 部署的 Azure 函数缺少实体框架 .edmx 文件 - FileNotFoundException
- reactjs - Reactjs setFocus 以编程方式在相关目标元素上
- laravel - 使用 Laravel 和 AWS 防止主机头注入
- java - 来自 spring boot junit5 的 InvalidUseOfMatchersException
- sas - 如何从 SAS 日志中删除禁止的语句
- reactjs - ReactYup 如果“null”打算作为空值,请务必将模式标记为 `.nullable()`
- java - 有没有办法在 Java 进程构建器中执行多个 Linux 命令?