在Python中动态导入包含多个文件的包
我正在尝试用python动态导入模块。 我需要一个插件导入系统 我使用以下代码导入模块,只要模块的整个代码都在同一个文件中,它就可以正常工作 caller.py代码: 之后,我使用load_module方法加载模块:在Python中动态导入包含多个文件的包,python,python-2.7,import,module,Python,Python 2.7,Import,Module,我正在尝试用python动态导入模块。 我需要一个插件导入系统 我使用以下代码导入模块,只要模块的整个代码都在同一个文件中,它就可以正常工作 caller.py代码: 之后,我使用load_module方法加载模块: module = imp.load_module(MainModule, *plugin["info"]) 目录的结构如下: Project/ --plugins/ ----plugin_1/ -------__init__.py -------X.py ca
module = imp.load_module(MainModule, *plugin["info"])
目录的结构如下:
Project/
--plugins/
----plugin_1/
-------__init__.py
-------X.py
caller.py
当所有方法都在同一个文件_init__.py中时,一切都很好
当我在_init__.py中使用的方法从同一个包中的另一个文件调用另一个方法时,会出现一个错误,表示没有名为X的模块
__init__u;.py代码在以下行失败:
import X
我也试过了
import plugin_1.X
和其他变体
只是为了确保你们理解——以正常的方式导入和使用模块并不能很好地动态工作
我错过了什么?
还有别的办法吗?可能使用uuu导入uuu方法,或者其他方法?我通常使用importlib。这是load_模块方法完成的。您可以将导入代码放入plugins/\uuuu init\uuuuu.py中,以执行以下操作:
import importlib
import os
import logging
skip = set(("__init__.py",))
plugins = []
cwd = os.getcwd()
os.chdir(os.path.dirname(__file__))
for mod in glob.glob("*.py"):
if mod in skip:
continue
try:
mod = mod.replace(".py", "")
plugin = importlib.import_module("." + mod, __name__)
plugin.append(plugin)
except Exception as e:
logging.warn("Failed to load %s: %s. Skipping", mod, e)
os.chdir(cwd)
import importlib
import os
import logging
skip = set(("__init__.py",))
plugins = []
cwd = os.getcwd()
os.chdir(os.path.dirname(__file__))
for mod in glob.glob("*.py"):
if mod in skip:
continue
try:
mod = mod.replace(".py", "")
plugin = importlib.import_module("." + mod, __name__)
plugin.append(plugin)
except Exception as e:
logging.warn("Failed to load %s: %s. Skipping", mod, e)
os.chdir(cwd)