从多个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'