Python插件系统
我正在构建一个自定义语音识别,为此我定义了一个命令界面。这个想法是语音识别返回一个字符串,我得到了所有受支持命令的列表。然后我会浏览列表,找到最匹配的一个并执行它 为了保持代码的可维护性,我想创建一个插件系统,在这个系统中,您可以在一个单独的文件中定义一个从ICommand派生的类。文件夹结构如下所示:Python插件系统,python,plugins,Python,Plugins,我正在构建一个自定义语音识别,为此我定义了一个命令界面。这个想法是语音识别返回一个字符串,我得到了所有受支持命令的列表。然后我会浏览列表,找到最匹配的一个并执行它 为了保持代码的可维护性,我想创建一个插件系统,在这个系统中,您可以在一个单独的文件中定义一个从ICommand派生的类。文件夹结构如下所示: project/ ├── ICommand ├── commands/ │ ├── command1.py (inherits ICommand) │ ├── command2.py (
project/
├── ICommand
├── commands/
│ ├── command1.py (inherits ICommand)
│ ├── command2.py (inherits ICommand)
我在这方面面临多个问题:
- 如何在command1.py文件中导入ICommand进行继承
from ..ICommand import ICommand
(当然,ICommand必须是定义ICommand的.py文件)
- 如何为.py文件中包含的每个类创建一个实例 在“命令”文件夹中
zope.configuration
就是其中之一,但是您必须用它应该扫描的文件夹创建类似xml的文件
自己动手可以很容易,只需列出所需的文件夹,并调用\uuuuuu import\uuuu
获取其中的任何Python文件。
t调用\uuuu import\uuuu
返回的对象是模块本身,您只需检查其内容中的子类(或其他实现)ICommand
,然后实例化即可
module = __import__(...)
plugins = {}
for name, obj in module.__dict__.items():
if isinstance(obj, ICommand):
plugins[name] = obj() # This instatiate the class
我有两个答案,并以明确的例子说明如何做到这一点:
- 有没有办法确保插件文件只包含 派生ICommand类的定义
否则,您的意思可能是希望“每个文件有一个ICommand子类”,没有其他限制:然后在上面的循环中插入一个检查来实例化插件-如果它在同一个文件中找到第二个类,则引发异常 非常感谢你,我要试试看。