[英]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.