我正在处理一个脚本,该脚本将从目录(plugins
)中加载插件,并且这些插件文件应包含一个从基类(BaseClass
)继承的类。我不知道插件文件或子类的名称,但我计划使用BaseClass.__subclasses__()
查找所有插件类。
在我的main.py
中,我要遍历plugins
文件夹并像这样加载每个模块:
pluginlist = []
for pluginfile in pluginfiles :
pluginlist.append(importlib.import_module(pluginfile))
但是,当我以这种方式导入它们时,它们找不到BaseClass
:
class CustomPlugin(BaseClass) :
NameError: name 'BaseClass' is not defined
我尝试在BaseClass
中定义main.py
并事先将其导入,并且尝试将其导入插件文件中,但无法弄清楚如何导入
导入依赖其他python模块的动态python模块的最佳方法是什么?
编辑:
main.py
:
import importlib
import os
plugindir="plugins"
pluginfiles = os.listdir(plugindir)
for pluginfile in pluginfiles :
testfile = importlib.import_module("plugins."+pluginfile)
print(dir())
在plugins
文件夹中:
baseclass.py
:
class BaseClass() :
def __init__(self) :
print("I am a base class")
customplugin.py
:
from .baseclass import BaseClass
class CustomPlugin(BaseClass) :
def __init__(self) :
print("I am a custom subclass of BaseClass")
答案 0 :(得分:0)
似乎我在importlib.import_module()
语句中包含了“ .py”,对此进行了更改:
for pluginfile in pluginfiles :
testfile = importlib.import_module("plugins."+pluginfile)
对此:
for pluginfile in pluginfiles :
testfile = importlib.import_module("plugins."+pluginfile.split('.')[0])
解决了导入问题。将baseclass.py
放在main.py
的主文件夹中解决了子类化问题。