首页 > 解决方案 > 从多个 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"
 },
 ...
]

有什么简单的方法可以做到这一点?还是我必须创建和更新列出所有这些详细信息的静态文件?我的意图是我可以在未来继续添加新模型,并且仍然能够在需要时轻松提取此列表。

标签: pythonpython-3.x

解决方案


您可以使用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__ + '.')


推荐阅读