如何在Python3.0中动态导入模块?
我想动态地导入一系列模块,但遇到了一些问题。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.