插件系统(全都插上)

介绍

在平时我们想为程序添加功能,需要去改程序主代码,挺麻烦的。所以模块化,插件系统就出现了

文件结构

PluginMaganer.py 👉插件管理器
(管理插件的注册,运行等)

plugins👉插件存放的文件夹
(所有插件都存放在这个文件夹内)
在这里插入图片描述
plugin1.py👉插件1
plugin2.py👉插件2
在这里插入图片描述

插件管理器

插件管理器也是一个插件
1.初始化五个变量

变量描述
plugins存放插件名称的列表,用来注册插件的
plugin_path插件文件夹路径
name插件名称
author插件作者
describe插件的介绍
def __init__(self):
    self.plugins = []        
    self.plugin_path = "../work/demo/plugins"        
    self.name = "插件管理器 "        
    self.author = "buxiaju "        
    self.describe = " 插件的管家"

2.打印相关信息
这个没什么好说的

def to_string(self):
    print("[INFO] 名称:",self.name)        
    print("[INFO] 作者:",self.author)        
    print("[INFO] 描述:",self.describe)

3.注册插件
os.listdir扫描插件文件夹下的插件
if plugin_temp[-1] == "py":判断是否是py文件,只要是py文件就视为插件,所以在插件文件夹下不能用不相关的py文件

def register_plugin(self):
    try:            
        plugins = os.listdir(self.plugin_path)                        
        for i in plugins:                
            plugin_temp = i.split(".")                
            if plugin_temp[-1] == "py":                    
                self.plugins.append(plugin_temp[0])            
            print("[INFO] 发现插件")            
            print("[INFO] :",self.plugins)            
            print("----------------------------")       
    except Exception as e:            
         print("[ERROR] 没有发现插件")

4.加载插件
load_plugin()加载单个插件,返回模块实例
load_all_plugin加载所有插件
这里用到了加载模块importlib这个库
importlib.import_module(文件夹名.文件名)加载模块

import importlib

def load_plugin(self, plugin):
    # 加载插件        
    plugin_module = "plugins" + "." + plugin        
    try:            
        # 导入执行模块            
        print("[INFO] 加载插件:",plugin)            
        module = importlib.import_module(plugin_module)            
        print("[INFO] 加载",plugin,"成功")            
        return module # 返回模块实例       
    except Exception as e:            
        print("[ERROR] 加载失败:",e)            
        return 1                    
def load_all_plugin(self):        
    for i in self.plugins:            
        self.load_plugin(i)

5.运行插件
run_plugin()运行单个插件
run_all_plugin运行所有插件

def run_plugin(self, plugin):
    module = self.load_plugin(plugin)        
    if module == 1:            
        example = module.Plugin()  # 获取类实例          
        example.start()  # 运行类方法                  
    else:            
        print("[ERROR] 运行失败")         
def run_all_plugin(self):        
    for i in self.plugins:            
        module = self.load_plugin(i)            
        example = module.Plugin()            
        example.start()

6.运行管理器
这个没什么说的


def start(self):
    self.to_string()            
    self.register_plugin()        
    self.run_all_plugin()        

全部代码

import os
import importlib
class PluginManager():
    def __init__(self):        
        self.plugins = []        
        self.plugin_path = "../work/demo/plugins"        
        self.name = "插件管理器 "        
        self.author = "buxiaju "        
        self.describe = " 插件的管家"            
    def to_string(self):        
        print("[INFO] 名称:",self.name)        
        print("[INFO] 作者:",self.author)        
        print("[INFO] 描述:",self.describe)            
    def register_plugin(self):                
        try:            
            plugins = os.listdir(self.plugin_path)                        
            for i in plugins:                plugin_temp = i.split(".")                
                if plugin_temp[-1] == "py":                    
                    self.plugins.append(plugin_temp[0])            
            print("[INFO] 发现插件")            
            print("[INFO] :",self.plugins)            
            print("----------------------------")   except Exception as e:            
            print("[ERROR] 没有发现插件")           
    def load_plugin(self, plugin):        
        # 加载插件        
        plugin_module = "plugins" + "." + plugin        
        try:            
            # 导入执行模块            
            print("[INFO] 加载插件:",plugin)            module = 
            importlib.import_module(plugin_module)            
            print("[INFO] 加载",plugin,"成功")            
            return module        
        except Exception as e:            
            print("[ERROR] 加载失败:",e)            
            return 1                    
    def load_all_plugin(self):        
        for i in self.plugins:              
            self.load_plugin(i)                    

    def run_plugin(self, plugin):           
        module = self.load_plugin(plugin)        
        if module == 1:            
            example = module.Plugin()            
            example.start()                    
            else:            
                print("[ERROR] 运行失败")         
    def run_all_plugin(self):        
        for i in self.plugins:            
            module = self.load_plugin(i)            
            example = module.Plugin()            
            example.start()        
    def start(self):        
        self.to_string()         
        self.register_plugin()        
        self.run_all_plugin()                
       
if __name__=="__main__":    
    pluginManager = PluginManager()        
    pluginManager.start()

插件

1.每个插件的文件名就是插件的名称
2.插件的类必须是Plugin
3.要么继承threading.Thread重写run方法;要么自己写一个start()方法
4.其它都不重要

import threading
class Plugin(threading.Thread):    
    def __init__(self):        
        super(Plugin, self).__init__()        
        self.name = " Plugin1"        
        self.author = "buxiaju "        
        self.describe = " 我是第一个插件"            
    def to_string(self):        
        print("[INFO] 名称:",self.name)          
        print("[INFO] 作者:",self.author)        
        print("[INFO] 描述:",self.describe)
                
    def run(self):        
        self.to_string()        
        print("----------------------------")

运行结果

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值