【提效工具开发】管理Python脚本执行系统实现页面展示

news2024/11/21 14:42:45

Python脚本执行:工具管理Python脚本执行系统

背景

在现代的软件开发和测试过程中,自动化工具和脚本的管理变得至关重要。为了更高效地管理工具、关联文件、提取执行参数并支持动态执行Python代码,我们设计并实现了一套基于Django框架的工具管理和执行系统。

该系统旨在实现以下目标:

  1. 提供对工具及其关联文件的集中化管理。
  2. 动态提取工具文件中的参数。
  3. 支持在线执行工具并记录执行历史。
  4. 确保工具与其关联文件之间的关系清晰,避免文件冲突和错误。

系统设计与实现

数据模型

系统包含以下主要模型:

  1. Tool
    表示一个工具,记录工具的基本信息(如名称、参数等)。
    字段:

    • id: 工具唯一标识。
    • name: 工具名称。
    • parameters: JSON格式的参数集合,用于存储从文件中提取的参数。
  2. ToolFile
    表示与工具关联的文件,可以是工具的主文件或者辅助文件。
    字段:

    • id: 文件唯一标识。
    • tool: 外键,关联的工具。
    • file_name: 文件名。
    • code_content: 文件内容。
    • is_main: 是否为主文件。
  3. PythonExecutionRecord
    用于记录工具执行的历史记录,包括输入参数、执行结果和日志。
    字段:

    • id: 记录唯一标识。
    • tool: 外键,执行的工具。
    • executor: 执行人。
    • parameters: 执行时的输入参数。
    • output: 执行输出结果。
    • log: 执行日志。
    • started_at: 执行开始时间。
    • ended_at: 执行结束时间。
    • execution_time: 执行时长。
  4. ToolToolFileRelation
    用于表示工具与文件之间的多对多关系,支持多工具共享文件。


实现过程

1. 工具参数提取逻辑

PythonExecutionRecordViewSet 中实现了以下方法:

  • extract_parameters
    使用正则表达式提取代码内容中以 $ 开头的变量(如 $param1),并将其解析为参数列表。

  • save_tool_files_and_extract_parameters
    遍历工具的所有关联文件,调用 extract_parameters 提取参数并保存到 Toolparameters 字段中。

2. 工具与文件的关联管理

ToolFileViewSet 中处理了以下场景:

  • 创建文件
    检查是否设置为主文件。如果已存在主文件,则禁止重复创建主文件。

  • 更新文件
    同样检查主文件冲突情况,并在文件更新后重新提取工具的参数。

3. 工具执行逻辑

PythonExecutionRecordViewSet 中实现了工具执行的核心逻辑:

  • 参数校验
    比对用户输入的参数和工具中提取的参数,提示缺失的参数信息。

  • 执行主文件
    将工具的主文件及其关联文件写入临时目录,替换参数占位符后执行主文件代码。

  • 执行记录
    将执行的输入参数、输出结果、执行日志等信息保存为一条记录。


表之间的关系

  1. Tool 与 ToolFile
    Tool 通过一对多关系关联多个 ToolFile,每个 ToolFile 可以指定是否为主文件。主文件是执行的核心,其它文件为辅助文件。

  2. Tool 与 PythonExecutionRecord
    Tool 通过一对多关系关联多个执行记录,每次执行都会创建一条新的记录。

  3. Tool 与 ToolToolFileRelation
    通过 ToolToolFileRelation 实现了工具与文件的多对多关系,从而支持文件的复用。


执行 脚本 详细流程说明

PythonExecutionRecordViewSet 中,核心功能是处理工具的执行逻辑,以下是执行过程的详细说明:


1. 参数校验阶段
  1. 接收请求数据
    用户在前端选择工具并输入执行参数后,系统通过 API 接收这些信息,包括:

    • 工具 ID
    • 用户输入的参数集合
  2. 验证工具有效性
    根据工具 ID 检查工具是否存在,并确认其是否具有主文件。如果工具不存在或没有主文件,立即返回错误响应。

  3. 比对参数完整性
    从工具的 parameters 字段中读取该工具所需的全部参数,然后与用户提供的参数集合进行对比:

    • 如果存在缺失参数:返回缺失参数的详细信息,提示用户补充。
    • 如果参数齐全:进入执行阶段。

2. 准备执行环境阶段
  1. 创建临时目录
    在服务器中为当前执行请求创建一个独立的临时目录,用于存储该工具的主文件和辅助文件,确保执行过程互不干扰。

  2. 提取并保存文件
    遍历该工具关联的所有文件,将 ToolFile 表中的文件内容写入临时目录,并按文件名进行命名。

    • 确保工具的主文件被正确识别,并单独保存到特定路径。
    • 将辅助文件保存在相同目录中,以供主文件在执行时调用。
  3. 替换参数占位符
    在文件内容中查找以 $ 开头的参数占位符,并用用户输入的实际参数值进行替换。此步骤确保生成的代码是可以正常执行的。


3. 执行工具阶段
  1. 执行主文件
    使用 Python 的子进程管理工具在创建的临时目录中执行主文件。执行时:

    • 主文件及其辅助文件都在同一目录下,确保文件间的依赖关系可以被正确解析。
    • 捕获执行的标准输出、标准错误输出,以及返回状态码。
  2. 设置超时限制
    每次执行都设置了最大超时时间(如 5 分钟)。如果执行超过时间,子进程会被强制终止,并记录超时错误。

  3. 记录执行日志

    • 如果执行成功:记录标准输出内容。
    • 如果执行失败:捕获标准错误内容和异常信息,并记录执行失败原因。

4. 记录执行结果阶段
  1. 计算执行时间
    根据执行开始和结束时间计算总耗时,便于后续性能分析。

  2. 保存执行记录
    将以下信息保存到 PythonExecutionRecord 表中:

    • 执行的工具 ID
    • 用户输入的参数集合
    • 执行的标准输出内容(或错误日志)
    • 执行开始和结束时间
    • 总执行时长
  3. 清理临时文件
    执行完成后,删除临时目录中的所有文件,避免占用服务器存储空间。


5. 返回结果阶段
  1. 构造响应
    系统根据执行结果构造响应数据:

    • 如果执行成功:返回执行的输出结果和执行时间。
    • 如果执行失败:返回错误日志和失败原因。
  2. 发送响应
    系统将构造好的响应数据通过 API 返回给前端,提示用户执行状态(成功或失败)。


总结执行流程
  1. 接收前端的工具和参数请求。
  2. 校验工具是否有效,以及用户参数是否完整。
  3. 创建临时执行环境,准备并替换工具文件内容中的参数。
  4. 执行工具的主文件,并捕获输出或错误日志。
  5. 保存执行结果到数据库,包括详细的日志和执行时间。
  6. 清理执行过程中的临时文件,返回执行结果给前端。

技术亮点

  1. 参数提取与校验
    提取文件中动态参数的功能使工具能够更灵活地适配不同场景的执行需求。

  2. 主文件管理
    主文件的唯一性检查逻辑避免了执行时因文件冲突导致的问题。

  3. 执行过程隔离
    通过临时目录存储和执行代码,确保每次执行相互独立,减少对系统环境的污染。

  4. 执行记录的完整性
    每次执行均记录详细的日志、输入和输出信息,便于后续问题定位和性能分析。


示例代码片段

提取参数
def extract_parameters(self, file_content):
    pattern = r'\$(\w+)'
    parameter_names = re.findall(pattern, file_content)
    return {param: None for param in set(parameter_names)}
工具执行
process = subprocess.run(
    [sys.executable, main_file_path],
    capture_output=True,
    text=True,
    cwd=temp_dir,
    timeout=300,
)

页面展示:

1. 文件列表页面
在这里插入图片描述
2. 添加和更新文件
在这里插入图片描述
我添加了两个文件 一个 main文件 如下:

from test import bubble_sort

arr_example = $listData

# 调用函数并开始排序
bubble_sort(arr_example)

# 打印最终排序结果
print(f"最终排序结果: {arr_example}")

test 方法文件:

def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        # 标记是否发生了交换,如果没有发生交换说明列表已经有序
        swapped = False
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                # 交换元素
                arr[j], arr[j+1] = arr[j+1], arr[j]
                swapped = True
                print(f"第{i+1}轮排序后,数组状态为: {arr}")
        # 如果没有发生任何交换,则提前结束循环
        if not swapped:
            break

# 示例数组

3. 工具列表 注释:一个工具可以关联多个文件
在这里插入图片描述
4. 编辑和更新工具,添加删除关联的文件, 必须有一个main文件
在这里插入图片描述
5. 在列表页点击执行会跳转执行页面 如下:
点击文件的名称会自动跳转文件的详情页。
在这里插入图片描述
解释下: 参数配置, 是从文件自动提取出来的, 比如 在文件里 $listData, 就会被识别 ,然后添加到配置区域,输入参数。
点击执行后会校验是否有main 文件, 会从main文件开始入口执行, 然后会返回日志
6. 执行成功的报告如下:
在这里插入图片描述
执行失败如下:
在这里插入图片描述
7. 在执行页面可以查看执行的历史
在这里插入图片描述
点击展开可以看到日志详情:
在这里插入图片描述

后边的规划

  1. 要有模块的概念, 一个功能模块可以关联多个工具
  2. 文件,工具 ,和模块都要有 项目的概念, 项目组之间可以隔离数据
  3. 要有权限管理, 自己创建的不允许别人修改,要修改要授权

点赞大于 10 我把代码贴出来 ,感谢大家支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2244720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt-常用的显示类控件

QLabel QLabel有如下核心属性&#xff1a; 关于文本格式的验证&#xff1a; 其中<b>xxx<b>&#xff0c;就是加粗的意思。 效果&#xff1a; 或者再把它改为markdown形式的&#xff1a; 在markd中&#xff0c;#就是表示一级标题&#xff0c;我们在加上##后&#x…

2024 RISC-V中国峰会 安全相关议题汇总

安全之安全(security)博客目录导读 第四届 RISC-V 中国峰会(RISC-V Summit China 2024)于8月21日至23日在杭州成功举办。此次峰会汇聚了 RISC-V 国际基金会、百余家重点企业及研究机构,约3000人线下参与,并在19日至25日间举办了超过20场同期活动,与全球开发者共同…

聊一聊Elasticsearch的索引分片的恢复机制

1、什么是索引分片的恢复&#xff1f; 所谓索引分片的恢复指的是在某些条件下&#xff0c;索引分片丢失&#xff0c;ES会把某索引的分片复制一份来得到该分片副本的过程。 2、触发分片恢复的场景有哪些&#xff1f; 分片的分配 当集群中节点的数量发生变化&#xff0c;或者配…

典型的 SOME/IP 多绑定用例总结

SOME/IP 部署中 AP SWC 不自行打开套接字连接的原因 在典型的 SOME/IP 网络协议部署场景里&#xff0c;AP SWC 不太可能自己打开套接字连接与远程服务通信&#xff0c;因为 SOME/IP 被设计为尽可能少用端口。这一需求源于低功耗 / 低资源的嵌入式 ECU&#xff0c;并行管理大量…

MySQL查询执行(八):Memory引擎

思考&#xff1a;两个group by语句都用了order bynull&#xff0c; 为什么使用内存临时表得到的语句结果里&#xff0c; 0这个值在最后一行&#xff1b; 而使用磁盘临时表得到的结果里&#xff0c; 0这个值在第一行&#xff1f; 答&#xff1a;答案对应第一小节&#xff1a;内…

canva 画图 UI 设计

起因&#xff0c; 目的: 来源: 客户需求。 目的&#xff1a; 用数据讲故事。 数据可以瞎编&#xff0c;图表一定要漂亮。 文件分享地址 读者可以在此文件的基础上&#xff0c;继续编辑。 效果图 过程: 我还是喜欢 canva. figma&#xff0c; 我用的时候&#xff0c;每每都想…

ES分词环境实战

文章目录 安装下载1.1 下载镜像1.2 单节点启动 防火墙设置异常处理【1】iptable链路中断 参考文档 参加完2024年11月软考&#xff0c;对ES的分词进行考查&#xff0c;前期有【 Docker 环境下安装部署 Elasticsearch 和 kibana】和【 Docker 环境下为 Elasticsearch 安装IK 分…

论文精读: PRB LiVSe2 Zigzag链序实验与理论计算

DOI: 10.1103/PhysRevB.108.094107 摘要节选 在具有轨道自由度的过渡金属化合物中&#xff0c;组成元素在低温下自组装形成分子的现象普遍存在。 在本研究中从实验和理论两方面讨论了钒二维三角形晶格层状LiVX2 &#xff08;X O&#xff0c; S, Se&#xff09;体系中出现的三…

修改一下达梦disql 提示符

经常用disql的有时某些信息希望提示一下&#xff0c;默认的只显示SQL> 为了方便使用&#xff0c;可以在 glogin.sql 中增加些内容。 vi $DM_HOME/bin/disql_conf/glogin.sql增加以下几行 set time on set lineshow offcol global_name new_value global_name SELECT ins…

【蓝桥杯备赛】123(前缀和的复杂应用)

5. 前缀和的复杂应用 5.1. 123&#xff08;4 星&#xff09; 5.1.1. 题目解析 这道题仍然是求一段区间的和&#xff0c;很容易能够想到前缀和找规律&#xff1a; 1------------------1 号块 1 2----------------2 号块 1 2 3--------------3 号块 1 2 3 4------------4 号…

机器学习—学习曲线

学习曲线是帮助理解学习算法如何工作的一种方法&#xff0c;作为它所拥有的经验的函数。 绘制一个符合二阶模型的学习曲线&#xff0c;多项式或二次函数&#xff0c;画出交叉验证错误Jcv&#xff0c;以及Jtrain训练错误&#xff0c;所以在这个曲线中&#xff0c;横轴将是Mtrai…

数据库基础(MySQL)

1. 数据库基础 1.1 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便 数据库存储介质&#xff1a; 磁盘内存 为…

2024年11月HarmonyOS应用开发者基础认证全新题库

注意事项&#xff1a;切记在考试之外的设备上打开题库进行搜索&#xff0c;防止切屏三次考试自动结束&#xff0c;题目是乱序&#xff0c;每次考试&#xff0c;选项的顺序都不同 更新时间&#xff1a;2024年11月1日 这是基础认证题库&#xff0c;不是高级认证题库注意看清楚标…

静态时序分析--时序约束

目录 1.时钟约束1.1创建时钟1.2.生成时钟1.3虚拟时钟1.4 最小时钟脉宽 2.I/O延时约束2.1设置输入延时2.2设置输出延时 3.I/O环境建模约束3.1输入驱动建模3.2输出负载建模 4.时序例外4.1多周期路径设置&#xff08;multicycle path&#xff09;4.2伪路径设置&#xff08;false_p…

51单片机基础05 实时时钟-思路及代码参考2、3

目录 一、思路二 1、原理图 2、代码 二、思路三 1、原理图 2、代码 一、思路二 所有设定功能相关的操作均在矩阵键盘进行实现&#xff0c;并在定时器中扫描、计数等 1、原理图 2、代码 #include <AT89X52.h> //调用51单片机的头文件 //------------------…

【C++篇】深入剖析C++ Vector底层源码及实现机制

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

【代码pycharm】动手学深度学习v2-04 数据操作 + 数据预处理

数据操作 数据预处理 1.数据操作运行结果 2.数据预处理实现运行结果 第四课链接 1.数据操作 import torch # 张量的创建 x1 torch.arange(12) print(1.有12个元素的张量&#xff1a;\n,x1) print(2.张量的形状&#xff1a;\n,x1.shape) print(3.张量中元素的总数&#xff1…

鸿蒙HarmonyOS开发:一次开发,多端部署(工程级)三层工程架构

文章目录 一、工程创建1、先创建出最基本的项目工程。2、新建common、features、 products 目录 二、工程结构三、依赖关系1、oh-package.json52、配置ohpm包依赖 四、引用ohpm包中的代码1、定义共享资源2、在common模块index文件中导出3、在phone模块oh-package.json5文件中引…

NLP论文速读(EMNLP 2023)|工具增强的思维链推理

论文速读|ChatCoT: Tool-Augmented Chain-of-Thought Reasoning on Chat-based Large Language Models 论文信息&#xff1a; 简介&#xff1a; 本文背景是关于大型语言模型&#xff08;LLMs&#xff09;在复杂推理任务中的表现。尽管LLMs在多种评估基准测试中取得了优异的成绩…

uniapp vue3小程序报错Cannot read property ‘__route__‘ of undefined

在App.vue里有监听应用的生命周期 <script>// 只能在App.vue里监听应用的生命周期export default {onError: function(err) {console.log(AppOnError:, err); // 当 uni-app 报错时触发}} </script>在控制台打印里无意发现 Cannot read property ‘__route__‘ of …