【发布时间】:2019-12-03 00:29:59
【问题描述】:
我正在编写一个脚本,该脚本将从目录 (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
我尝试在main.py 中定义BaseClass 并预先导入它,我尝试在插件文件中导入它,但无法弄清楚如何导入它。
导入依赖于其他 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")
【问题讨论】:
-
您是否从这些插件中正确导入了 BaseClass?它们不会共享循环正在运行的全局模块状态,每个模块都有一个孤立的范围,python 称之为“全局”
-
我不确定如何正确导入 BaseClass,因为理想情况下它应该位于
plugins目录之上。当我在plugins的文件中定义 BaseClass 并将其导入时,我收到有关plugins.customplugin is not a package的错误。 -
这些插件的文件夹中有
__init__.py文件吗?这就是定义 python 包的原因 -
plugins文件夹中有一个__init__.py,是的。 -
你能分享一个完整的最小插件吗?更具体地说,在其中进行导入的方式和位置
标签: python-3.x plugins python-import subclassing