【问题标题】:Unable to use dynamically imported modules无法使用动态导入的模块
【发布时间】:2014-12-17 15:08:53
【问题描述】:

我正在从子目录中动态导入不是__init__.py 或我的skeleton.py 文件的任何.py 模块。我首先建立了一个列表,看起来像(.py 被省略):

mods_in_dir = ['my_mods.frst_mod','my_mods.scnd_mod']

my_mods 是子目录,frst_mod.pysncd_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

【问题讨论】:

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


    【解决方案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()
    ...
    

    【讨论】:

    • 我只是按照您的建议进行了尝试,但我仍然无法使用该功能,而且sys.modules.keys().. 中甚至没有提到的模块.. 编辑:我确实得到了<map object at 0x02AA0F30> map 命令..
    • @DaedalusMythos 错误信息是什么?一样吗?
    • 是的,我确实遇到了同样的错误。name '..' is not defined
    • @DaedalusMythos 是你调用函数的方式不对。检查我的更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-30
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多