我从子目录中动态导入任何不是__init__.py
或我的skeleton.py
文件的 .py 模块。我首先构建一个看起来像( .py省略)的列表:
mods_in_dir = ['my_mods.frst_mod','my_mods.scnd_mod']
my_mods 将子目录, frst_mod.py 和 sncd_mod.py 作为可用模块。我导入的所有模块都包含class Operation
,它总是提供相同的三个功能。然后我使用importlib导入它们。
import importlib
imports = {}
for i in mods_in_dir:
imports[i] = importlib.import_module(i)
这导致了明显成功的导入,因为我在print(sys.modules.keys())
进行了检查,显示为[...], 'my_mods.frst_mod', 'my_mods.scnd_mod', [...]
。
出于测试原因,我在每个模块中定义了一个函数:
def return_some_string():
return "some string"
但是我无法调用此功能。我已经尝试过一些我想到的东西......例如print(my_mods.frst_mod.Operation.return_some_string())
或print(frst_mod.Operation.return_some_string())
两者都会产生NameError: name 'my_mods' is not defined
或NameError: name 'frst_mod' is not defined
编辑: 的解决。
@ m170897017帮我解决了我最初尝试的问题。
我错过了imports
dict中的模块并没有使用它。
print(imports['my_mods.frst_mod'].ModsClassName.return_some_string())
现已成功打印some_string
答案 0 :(得分:1)
以这种方式更改动态导入,然后重试:
...
mods_in_dir = ['my_mods.frst_mod','my_mods.scnd_mod']
modules = list(map(__import__, mods_in_dir))
# if you want to invoke func1 in my_mods.frst_mod and get result from it
result1 = modules[0].func1()
# if you want to invoke func2 in my_mods.scnd_mod and get result from it
result2 = modules[1].func2()
...