1

我想做一些类似插件系统的东西,但不能让它工作。具体来说,我有一些要求。

我有主脚本,应该在 ./plugins 目录中搜索其他 python 脚本并加载它们。这个主脚本正在搜索从 Base 继承的类globals()

如果我将这些类放在同一个主文件中,它会很好地工作,但我无法按我的意愿工作。

是否有可能在 Python 中做到这一点?

我试着做一些这样的:

来源:插件/test.py

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

主脚本只是在这个类上执行一些方法。

4

3 回答 3

0

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

对于 py3,我认为有 importlib,但我不知道如何临时使用它。

于 2013-06-09T12:18:03.547 回答
0

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

于 2013-06-09T12:01:44.247 回答
0

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

...或者,更 Python 地说,只需使用 hasattr 来确定导入的类是否“像鸭子一样嘎嘎”(即,具有您期望从插件中获得的方法)。

PS - 我假设你要的是 python 2.x。将来用版本号标记帖子是个好主意。

于 2013-06-09T16:47:39.163 回答