每天进步一点点:自动重载【动态添加python脚本文件,自动加载】
project目录结构
代码实现
- 其中一个组件代码
# 其中的com_china.py文件,其他里面都一样是实现各种功能的函数
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:Sun
# datetime:2022/8/4 0004
def check_a(m):
"""
必须要在此处写函数的能力,便于生成标签,前端显示
:param m:
:return:
"""
return "a"
def like_you(m):
"""
函数的功能
:param m:
:return:
"""
return "我是new加入的"
- check_components包下的__init__.py文件收集所有组件实现的能力
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:Sun
# datetime:2022/8/2 0002
import os
import sys
import importlib
"""因随业务发展,支持前端向本目录下上传新的校验项文件,实现动态加载"""
dir_path = os.path.dirname(os.path.abspath(__file__))
# 将当前目录加入到python解释器执行目录中,让其能够找到本文件并加载本文件加载的模块,防止因相对导入而报错
sys.path.append(dir_path)
# print(sys.path)
__all__ = ["check_module_path_list"]
check_module_path_list = []
def os_discover_dir():
"""不支持子目录导入,只能在当前根目录下导入"""
global check_module_path_list
for root, dirs, files in os.walk(dir_path, topdown=False):
for _file_name in files:
# 排除__pycache__目录及*.pyc文件以及__init__.py文件
if not _file_name.startswith("__init") and not _file_name.endswith(".pyc"):
module_name, ext = os.path.splitext(os.path.basename(_file_name))
module = importlib.import_module(module_name)
check_module_path_list.append(module)
os_discover_dir()
- 重载文件main_discover.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:Sun
# datetime:2022/8/2 0002
"""
热重载模块的使用
python版本: Python 2.7, >=3.5
pip install AoikLiveReload
"""
import datetime
from pprint import pprint
from check_components import check_module_path_list
from aoiklivereload.aoiklivereload import LiveReloader
dic = dict()
# 自动加载新的校验项
print("自动加载的模块列表为:", check_module_path_list)
for i in check_module_path_list:
for fun in dir(i):
if not str(fun).startswith('__'):
# 构建校验字典{校验项英文名:{校验项模块对象:object,校验项方法名:"func_name",校验项前端说明:""}}
dic.update({
f"{i.__name__}_{fun}".upper(): {
"module_name": i,
"fun_name": fun,
"title": getattr(i, fun).__doc__.split()[0] if getattr(i, fun).__doc__ else "此title最好是实现在函数定义时就确定便于前端拿到显示为选项",
}
})
# print(fun, type(fun))
# ret = getattr(i, fun)(888)
# print(ret)
pprint(dic)
# 调用某个校验项
ret = getattr(dic["COM_CHINA_CHECK_A"]["module_name"], dic["COM_CHINA_CHECK_A"]["fun_name"])(888888)
print(datetime.datetime.now(), ret)
# Create reloader
reloader = LiveReloader()
# Start watcher thread
reloader.start_watcher_thread()
# TODO: 功能实现注意点
# 1. 只能在指定的目录下创建文件,且文件名不允许与之前的一样,可以前端做效验也可以生成唯一id拼接实现
# 2. 本脚本可以当一个任务一直在执行,可以将对应的字典写入缓存
人生苦短,我用python!