使用importlib(python)从顶层访问嵌套包

2024-06-16 17:10:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类似以下简化示例的项目层次结构:

├── pacOne
│   ├── __init__.py
│   └── pacTwo
│       ├── __init__.py
│       └── modTwo.py
└── main.py

在我的示例中,pacTwo级别还有更多的包,我根据一个YAML文件加载这些包,其中的函数位于main.py。它是一个函数,因为在实际的程序中,它能做的更多,我在这篇文章中排除了这一点。在

^{pr2}$

导入模块后,我无法确定如何访问modTwo。它导入的很好,没有错误,但是一旦尝试访问它,我就得到错误消息,modTwo不是pacTwo的属性。在

下面是我如何尝试访问modTwo的示例:

globals()["pacOne." + module].modTwo.testFunc()

错误:

AttributeError: module 'pacOne.pacTwo' has no attribute 'modTwo'

所以问题是如何从main.py访问{},就像上面的importlib?或者这根本不可能,因为我不该这么做?在


编辑:

将导入函数更改为:

def loadModules(modules):
    for module in modules:
        moduleImport = importlib.import_module("pacOne." + module + ".modTwo")
        globals()["pacOne." + module + ".modTwo"] = moduleImport

访问它就像:

globals()["pacOne." + module + ".modTwo"].testFunc()

结果:

AttributeError: module 'pacOne.pacTwo.modTwo' has no attribute 'testFunc'

这很奇怪,因为当我用inspect来检查它时:

print(inspect.getmembers(moduleImport, inspect.isfunction))

我发现:

[('testFunc', <function testFunc at 0x7f5878df4d08>)]

我真的不知道该怎么解释。我只能假设我需要用不同的方式来称呼它,但我不知道怎么称呼它。在


Tags: 函数py示例initmain错误attributeerrormodule