在Python中动态导入包含多个文件的包

在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

我正在尝试用python动态导入模块。 我需要一个插件导入系统

我使用以下代码导入模块,只要模块的整个代码都在同一个文件中,它就可以正常工作

caller.py代码:

之后,我使用load_module方法加载模块:

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)