🔌插件系统实现
PART 1:PluginManager插件管理器
目的:实现多个插件的同时运行,插件的加载,插件的注册,插件信息的展示
根据用户选择,加载对应插件
列出对应插件参数
多线程同时运行多个插件
展示插件运行结果
消息队列处理多个插件返回结果
自行导入插件,同时安装插件依赖python库
加载类功能:
check函数用于遍历plugins文件夹中所有插件,判断是否所有插件都在Plugins.json中注册,如果未注册就交给注册类注册
# 加载类
class Load:
def __init__(self,Register) -> None:
self.Register=Register
pass
# 检测插件
def check(self):
# 读取 Plugins.json 文件
with open("myproject\PluginSystem\Plugins.json", 'r') as f:
registered_plugins = [i["name"] for i in json.load(f)['PluginList']]
# print(registered_plugins)
# 扫描子文件夹 Plugins 下的所有文件夹,找到其中的插件
plugins = []
for folder_name in os.listdir('myproject\PluginSystem\Plugins'):
folder_path = os.path.join('myproject\PluginSystem\Plugins', folder_name)
if os.path.isdir(folder_path) and os.path.isfile(os.path.join(folder_path, 'info.json')):
plugins.append(folder_name)
# print(plugins)
# 检查每个插件是否都已经在 Plugins.json 中注册,为注册则注册该插件
for plugin in plugins:
if plugin not in registered_plugins:
# print(f'Error: Plugin {plugin} is not registered in Plugins.json')
self.Register.registe(plugin)
print("所有插件加载完成")注册类功能:
registe(self, plugin_name):
函数接收插件名PluginName将对应的插件注册到Plugins.json中__add_PluginInfo(self,args={}):添加plugin信息
__find_info(self,PluginName):
找到plugin的信息,返回一个字典,字典中包含了插件的信息,例如名字,版本,状态等等。
__pip_install_requirements(self,file_path):
安装依赖库
is_in_pluginlist(self,plugin_name,plugin_version):
判断是否注册过该插件
List_all_info(self):列出所有的plugin
List_all_name_version(self):列出所有plugin的插件名和版本号
List_index_info(self,namelist):列出指定namelist的plugin的info,namelist是一个列表,返回一个info列表
run_plugins(self,ArgsList=None):解析所有表单信息,根据指定参数运行对应插件
__Generator_PluginObj(self,name=None):根据表单解析后的字典生成一个插件类(私有函数)
show_result(self):展示运行结果调用插件的show_result()
根据接收的插件对象,和运行参数创建一个线程运行该插件
PART 2:MessageManager插件消息管理器
目的:实现一个监听线程处理插件返回的消息
处理插件返回的消息
处理插件返回的日志
储存插件返回的结果
监听多线程消息的实现原理:插件接口会接收来自各个插件返回的消息交给一个队列,开辟的监听线程会实时监听该队列,并且解析从队列中读取的消息,分类交给Recorder库将消息存储起来
PART 3:plugins.Interface插件接口
Interface.Trans_message(message)
向插件系统传递消息,插件系统会根据message处理消息
Get_HTMLExtractor(HTML="")
获取一个HTML解析器,HTML提取器将会解析html的input输入框,form表单,textarea多行输入框,接口使用实例
Get_SelfDefExtractor(setting={})
获得一个自定义提取器,提取指定的html元素
request_form(args)
针对使用HTMLExtractor.extract_form()提取器提取的表单结果,发送请求的一个接口,返回一个响应
接收参数详解:
具体实现:
request_input(args)
针对使用HTMLExtractor.extract_input()提取器提取的input输入框结果,发送请求的一个接口,返回一个响应
Get_Storage()
获得一个Storage对象用于向对数据库的操作:1.创建表单 2.向指定表单插入数据
GET_Recorder(project_name)
Get_file(plugin,filename,type)
获得该插件的工作路径下的文件操作
Get_a_file(file_path,type)
获得一个文件:
Get_url_from_scrapy(project_name)
从scrapy扫描结果载入url文件
最后更新于
这有帮助吗?