繁体   English   中英

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

[英]Dynamically import packages with multiple files in Python

我正在尝试在python中动态导入模块。 我需要类似插件导入系统的工具。

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

caller.py代码:

PluginFolder = "./plugins"
MainModule = "__init__"
possibleplugins = os.listdir(PluginFolder)
for possible_plugin in possibleplugins:
    location = os.path.abspath(os.path.join(PluginFolder, possible_plugin))
    if not os.path.isdir(location) or not MainModule + ".py" in os.listdir(location):
        continue
    info = imp.find_module(MainModule, [location])
    plugin = {"name": possible_plugin, "info": info}

之后,我使用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__.py代码在以下行失败:

import X

我也试过

import plugin_1.X

和其他变体。

只是为了确保您了解-以正常方式(不是动态地)导入和使用模块即可正常工作。

我想念什么? 还有另一种方法吗? 也许使用__import__方法,还是其他?

我通常使用importlib 它是load_module方法完成的工作。 您可以将导入代码放入plugins/__init__.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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM