介绍
在平时我们想为程序添加功能,需要去改程序主代码,挺麻烦的。所以模块化,插件系统就出现了
文件结构
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("----------------------------")