制作插件系统之类的东西

时间:2013-06-09 10:34:34

标签: python

我想制作类似于插件系统的东西,但却无法使其正常工作。具体来说,我有一些要求。

我有主脚本谁应该在./plugins目录中搜索其他python脚本并加载它们。 此主脚本使用globals()

搜索从Base继承的类

如果我将这些类放在同一个主文件中,它的效果非常好,但我无法按照自己的意愿使用它。

是否可以在Python中执行此操作?

我试着做一些这样的事情:

source:plugins / test.py

class SomeClass(Base):
    def __init__(self):
        self.name = "Name of plugin"

主脚本只需在此类上执行一些方法。

3 个答案:

答案 0 :(得分:0)

您可以动态导入python文件或使用exec语句(确保定义要执行的上下文,否则将使用您使用该语句的上下文)。然后使用Base.__subclasses__,假设Base是新式类,或者从导入的插件模块调用函数。在后一种情况下,您必须提供插件注册机制。

答案 1 :(得分:0)

使用http://docs.python.org/2/library/imp.html#imp.load_module

对于py3我认为有importlib,但我不知道如何随意使用那个。

答案 2 :(得分:0)

尝试使用imp导入模块 - imp.loadmodule将允许您根据需要动态创建命名空间名称。然后,您可以使用inspect。getmembers()和inspect.is_class()来查找导入模块中的类(此answer中的示例代码),以查找此处定义的所有clases。测试那些是你的插件的子类。

...或者,更热门的是,只需使用hasattr来查明导入的类是否像“鸭子”一样庸医(即,拥有您期望从插件中获得的方法)。

PS - 我假设你要求python 2.x.最好在将来用版本#标记帖子。