从多个python模块访问公共属性

从多个python模块访问公共属性,python,python-3.x,Python,Python 3.x,我不完全确定这个标题是否适合这个问题,但以下是我试图实现的目标: 我的目录结构如下: models/ modelA/ src/ modelA.py __init__.py modelB/ src/ modelB.py __init__.py scripts/ sandbox.py 每个模型文件夹中的_init__;.py文件包含以下代码: from .src.modelA import mo

我不完全确定这个标题是否适合这个问题,但以下是我试图实现的目标: 我的目录结构如下:

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"
 },
 ...
]
有什么简单的方法可以做到这一点吗?或者我必须创建并更新一个列出所有这些细节的静态文件吗?我的意图是,我可以在未来不断添加新的模型,并且仍然能够在需要时轻松提取此列表

您可以使用迭代子模块:

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\u modules module.\uuuuu路径,module.\uuuu名称'.

这几乎解决了我的问题,但我不理解这种行为:对于进口商,modname,pkgutil.iter\u模块包中的ispkg。路径:如果ispkg:printprefix+modname model=\Uuu import\Uuuuu prefix+modname printmodel,则输出为:aiscripts.models.geom\u resnet aiscripts.models.some\u model它打印正确的子模块,但只导入顶级模块。所以我无法访问子模块的属性!您是否尝试过像我一样将前缀添加到iter_模块函数中:pkgutil.iter_模块module.\uuuu路径,模块.\uu名称\uuuu+'。“是的,我尝试过。同样的结果。modname是正确的,但实际上只导入了顶级模块。请尝试model=\uuuuu import\uuuu prefix+modname,fromlist='dummy',或者您可能希望使用:importlib.import\u module'prefix+modname'