每天进步一点点:自动重载【动态添加python脚本文件,自动加载】

project目录结构

代码实现

  1. 其中一个组件代码
# 其中的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加入的"
  1. 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()
  1. 重载文件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. 本脚本可以当一个任务一直在执行,可以将对应的字典写入缓存
posted @ 2022-08-04 16:06  Alive_2020  阅读(416)  评论(1编辑  收藏  举报