分享

Python 插件式开发示例

 Jcstone 2022-07-13 发布于湖北

一、程序结构

main.py为主程序

pluginManager.py插件加载

plugins作为应用程序插件存放目录,新增的插件.py文件放在该目录下。插件.py必须包含方法:name()和analysis(data)

如下所示:

+plugins

    -plugin1.py

    -plugin2.py

    -plugin3.py

pluginManager.py

main.py

二、pluginManager.py代码

GetPluginModules()返回插件module列表

import os
import importlib


class PluginManager:
    __PluginPath = 'plugins'

    def __init__(self):
        super().__init__(self)

    @staticmethod
    def GetPluginModules():
        modules = []
        pluginPath = PluginManager.__PluginPath
        if not os.path.isdir(pluginPath):
            raise EnvironmentError(f'{pluginPath} 目录不存在!')

        items = os.listdir(pluginPath)
        for item in items:
            pp = os.path.join(pluginPath, item)
            if os.path.isdir(pp):
                continue
            else:
                if (not item.endswith('.py')) or item == '__init__.py':
                    continue
                moduleName = item[:-3]
                fun = importlib.import_module(f"{pluginPath}.{moduleName}")
                modules.append(fun)
        return modules

三、插件编写示例代码

plugin1.py(py文件名可任意)

"""
分析方法之一
"""


def name():
    return "分析方法1"


def analysis(data):
    print(f"Plugin1:{data}")

plugin2.py(py文件名可任意)

"""
分析方法之一
"""
 

def name():
    return "分析方法2"


def analysis(data):
    print(f"Plugin2:{data}")

四、main.py加载插件并运行插件方法

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@Author : Jc Stone
"""

from pluginManager import PluginManager
import logging
import LogHelper


def main():
    # 获取模块列表
    functions = PluginManager.GetPluginModules()

    # 运行模块方法
    fun = functions[2]
    print(fun.name())
    fun.analysis("test")


if __name__ == "__main__":
    LogHelper.InitLogger(logging.getLogger())
    main()

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多