如何在Python3.0中动态导入模块?

3 投票
1 回答
1195 浏览
提问于 2025-04-15 14:59

我想动态地导入一系列模块,但遇到了一些问题。Python总是报出一个ImportError错误,告诉我我的模块不存在。

首先,我获取模块文件名的列表,并去掉".py"后缀,像这样:

viable_plugins = filter(is_plugin, os.listdir(plugin_dir))
viable_plugins = map(lambda name: name[:-3], viable_plugins)

然后,我使用os.chdir切换到插件目录,并用map __import__来导入所有模块,像这样:

active_plugins = map(__import__, viable_plugins)

但是,当我把active_plugins转换成一个列表,并尝试访问里面的模块时,Python会报错,告诉我无法导入这些模块,因为它们似乎不存在。

我到底哪里做错了呢?


补充:通过简单地使用交互式解释器,执行os.chdir__import__(modulefilename)就能得到我需要的结果。那么,为什么上面的做法不行呢?我在使用Python的更函数式部分时是不是做错了什么?

1 个回答

8

它说不能这样做,因为即使你切换到了模块所在的目录,但那个目录并不在你的导入路径上。

你需要做的,不是切换到模块所在的目录,而是把那个目录添加到 sys.path 中。

import sys
sys.path.insert(0, directory_of_modules)
# do imports here.

撰写回答