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

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_sortarr_example = $listData# 调用函数并开始排序
bubble_sort(arr_example)# 打印最终排序结果
print(f"最终排序结果: {arr_example}")

test 方法文件:

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

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

后边的规划

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

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

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

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

相关文章

鸿蒙开发:ForEach中为什么键值生成函数很重要

前言 在列表组件使用的时候,如List、Grid、WaterFlow等,循环渲染时都会使用到ForEach或者LazyForEach,当然了,也有单独使用的场景,如下,一个很简单的列表组件使用,这种使用方式,在官…

Figma插件指南:12款提升设计生产力的插件

在当今的设计领域,Figma已经成为许多UI设计师和团队的首选原型和数字设计软件。随着Figma的不断更新和插件库的扩展,这些工具极大地提升了设计工作的效率。本文将介绍12款实用的Figma插件,帮助你在UI设计中更加高效。 即时AI 即时AI利用先进…

揭秘云计算 | 5、关于云计算效率的讨论

一、 公有云效率更高? 解:公有云具有更高的效率。首先我们需要知道效率到底指的是什么。这是个亟须澄清的概念。在这里效率是指云数据中心(我们将在后文中介绍其定义)中的IT设备资源利用率,其中最具有代表性的指标就是…

Flutter:AnimatedPadding动态修改padding

// 默认top为10&#xff0c;点击后修改为100&#xff0c;此时方块会向下移动 padding: EdgeInsets.fromLTRB(left, top, right, bottom),class _MyHomePageState extends State<MyHomePage> {bool flag true;overrideWidget build(BuildContext context) {return Scaffo…

【c++丨STL】stack和queue的使用及模拟实现

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 一、什么是容器适配器 二、stack的使用及模拟实现 1. stack的使用 empty size top push和pop swap 2. stack的模拟实现 三、queue的…

JavaEE初学07

JavaEE初学07 MybatisORMMybatis一对一结果映射一对多结果映射 Mybatis动态sqlif标签trim标签where标签set标签foreach标签补充 在这里插入图片描述右击运行即可 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c71d44d027374a399d5d537ce96f00e1.png) Mybatis Myba…

《Spring Cloud 微服务架构探秘》

一、Spring Cloud 微服务架构概述 Spring Cloud 是基于 Spring Boot 构建的微服务开发框架&#xff0c;它充分利用了 Spring Boot 的便利性&#xff0c;极大地简化了分布式系统基础设施的开发。 Spring Cloud 具有诸多显著特点。首先&#xff0c;它提供了丰富的组件&#xff0…

【AIGC】破解ChatGPT!如何使用高价值提示词Prompt提升响应质量

文章目录 为什么高价值提示词如此重要&#xff1f;&#x1f50d;1.1 提升响应的相关性和准确性1.2 节省时间与资源1.3 增强用户体验 了解ChatGPT的工作原理&#x1f9e0;2.1 语言模型的训练过程2.2 上下文理解与生成2.3 限制与挑战 高价值提示词的核心要素✍️3.1 清晰明确的指…

D74【 python 接口自动化学习】- python 基础之HTTP

day74 http基础定义 学习日期&#xff1a;20241120 学习目标&#xff1a;http定义及实战 -- http基础介绍 学习笔记&#xff1a; HTTP定义 HTTP 是一个协议&#xff08;服务器传输超文本到浏览器的传送协议&#xff09;&#xff0c;是基于 TCP/IP 通信协议来传递数据&…

2025 -生物信息学- GEO - 神经网络分析-ANN

GEO - 神经网络分析-ANN 01. 准备文件 id GSM3587381_con GSM3587382_con GSM3587383_con GSM3587384_con GSM3587385_con GSM3587386_con GSM3587387_con GSM3587388_con GSM3587389_con GSM3587390_con GSM3587391_con GSM3587392_con GSM3587393_con GSM3587394_con GSM358…

uniapp页面样式和布局和nvue教程详解

uniapp页面样式和布局和nvue教程 尺寸单位 uni-app 支持的通用 css 单位包括 px、rpx px 即屏幕像素。rpx 即响应式px&#xff0c;一种根据屏幕宽度自适应的动态单位。以750宽的屏幕为基准&#xff0c;750rpx恰好为屏幕宽度。屏幕变宽&#xff0c;rpx 实际显示效果会等比放大…

5G Non-Public Network(三)Public Network Integrated NPN

这篇我们来看下PNI-NPN,之前都没有提到NPN引入的背景,这里就简单看下。 NPN引入的背景如上,就不细说了,贴在这里,确实很简单的看了下。紧接着就来看下规范上的内容。 相比于SNPN,PNI-NPN是PLMN提供的NPN,内容也要少很多,下面的内容参考38.300,38.331 ,38.304,23.50…

⾃动化运维利器Ansible-基础

Ansible基础 一、工作原理二、快速入门2.1 测试所有资产的网络连通性2.2 发布文件到被管理节点(资产) 三、资产(被管理节点)3.1 静态资产3.1.1 自定义资产3.1.2 自定义资产的使用3.1.3 资产选择器 四、Ansible Ad-Hoc 命令4.1 模块类型4.1.1 command & shell 模块4.1.2 cop…

一文了解Android中的AudioFlinger

AudioFlinger 是 Android 音频框架中的一个核心组件&#xff0c;负责管理音频流的混合和输出。它是 Android 音频系统服务的一部分&#xff0c;作为音频框架和硬件之间的桥梁&#xff0c;接收应用程序的音频请求、进行混音处理&#xff0c;并最终通过音频硬件输出声音。 下面我…

基于YOLOv8深度学习的智慧交通事故评级检测系统研究与实现(PyQt5界面+数据集+训练代码)

本文研究并实现了一种基于YOLOv8深度学习模型的智慧交通事故评级检测系统&#xff0c;旨在解决传统交通事故检测过程中效率低、误报率高等问题。该系统通过深度学习技术的应用&#xff0c;结合交通事故图像的分析&#xff0c;能够实现对事故的精准识别和评级&#xff0c;进而为…

使用MaxKB搭建知识库问答系统并接入个人网站(halo)

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;使用MaxKB搭建知识库问答系统并接入个人网站 前言 从OpenAI推出ChatGPT到现在&#xff0c;大模型已经渗透到各行各业&#xff0c;大模型也逐渐趋于平民化&#xff1b;从最开始对其理解、生成、强大的知识积累的惊叹&…

Android15之解决:Dex checksum does not match for dex:framework.jar问题(二百三十九)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

快速搭建Android开发环境:Docker部署docker-android并实现远程连接

目录 前言 1. 虚拟化环境检查 2. Android 模拟器部署 3. Ubuntu安装Cpolar 4. 配置公网地址 5. 远程访问 小结 6. 固定Cpolar公网地址 7. 固定地址访问 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊快速搭建Android开发环境&#x…

第十二章 并行Stream流

目录 一、引言 二、获取并行Stream流的两种方式 三、并行和串行Stream流的效率对比 四、parallelStream线程安全问题 五、parallelStream背后的技术 5.1. Fork/Join框架介绍 5.2. Fork/Join原理-分治法 5.3. Fork/Join原理-工作窃取算法 5.4. Fork/Join案例 一、引言 …

【EasyExcel】复杂导出操作-自定义颜色样式等(版本3.1.x)

文章目录 前言一、自定义拦截器二、自定义操作1.自定义颜色1.1.样式未生效原因&#xff1a;1.2.解决方法&#xff1a; 2.合并单元格 三、复杂操作示例1.实体(使用了注解式样式)&#xff1a;2.自定义拦截器3.代码4.最终效果 前言 本文简单介绍阿里的EasyExcel的复杂导出操作&…