无法使用动态导入的模块

时间:2014-10-22 08:07:09

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

我从子目录中动态导入任何不是__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 definedNameError: name 'frst_mod' is not defined

编辑: 的解决。

@ m170897017帮我解决了我最初尝试的问题。 我错过了imports dict中的模块并没有使用它。

print(imports['my_mods.frst_mod'].ModsClassName.return_some_string())现已成功打印some_string

1 个答案:

答案 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()
...