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

时间:2017-06-07 22:50:44

标签: python python-3.x import module python-import

我有一个项目层次结构,如下面的简化示例:

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

我的示例中有pacTwo级别的更多软件包,我根据YAML文件加载main.py的以下函数。这是一个功能,因为在实际的程序中,它有更多的功能,我已经排除了这篇文章的相关性。

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

导入模块后,我无法弄清楚如何访问modTwo。它导入得很好,没有错误,但一旦尝试访问它我就会收到错误,说modTwo不是pacTwo的属性。

以下是我尝试访问modTwo的示例:

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

错误:

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

所以问题是如何从modTwo.py 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>)]

我不确定该怎么做。我只能假设我需要以不同方式调用它,但我不知道如何。

0 个答案:

没有答案