我有一个项目层次结构,如下面的简化示例:
├── 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>)]
我不确定该怎么做。我只能假设我需要以不同方式调用它,但我不知道如何。