【提效工具开发】管理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_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 我把代码贴出来 ,感谢大家支持

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于大数据爬虫数据挖掘技术+Python的网络用户购物行为分析与可视化平台(源码+论文+PPT+部署文档教程等)

#1024程序员节|征文# 博主介绍:CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老…

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

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

Spring Cloud Alibaba、Spring Cloud 与 Spring Boot各版本的对应关系

参考spring-cloud-alibaba github wiki说明:版本说明 下面截取说明: 2022.x 分支 2021.x 分支 2.2.x 分支 组件版本关系

STM32完全学习——系统时钟设置

一、时钟框图的解读 首先我们知道STM32在上电初始化之后使用的是内部的HSI未经过分频直接通过SW供给给系统时钟,由于内部HSI存在较大的误差,因此我们在系统完成上电初始化,之后需要将STM32的时钟切换到外部HSE作为系统时钟,那么我…

ubuntu无密码用SCP复制文件到windows

默认情况下,ubuntu使用scp复制文件到windows需要输入密码: scp *.bin dev001@172.16.251.147:~/Desktop/. 为了解决每次复制文件都要输入密码这个问题,需要按如下操作: 1.创建ssh密钥 ssh-keygen -t ed25519 -C "xxx_xxx_xxx@hotmail.com" 2.使用scp复制公钥到w…

vulfocus在线靶场:CVE-2018-7600 速通手册

目录 一、启动环境,访问页面,语言选择中文,打开phpmyadmin 二、phpmyadmin中打开小房子 三、选择显示php信息 四、ctrlF,搜索flag,复制粘贴到任务中,通关 一、启动环境,访问页面,…

vue3 element el-table实现表格动态增加/删除/编辑表格行,带有校验规则

需求描述 在项目中遇到需要实现表格动态的新增、编辑、删除表格行的需求,同时带有校验规则 代码解决 点击新增的时候,给新增row默认属性,给相应的默认值,包括给一个isEditor: true,用来区分是否需要编辑。同时当有编…

python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具

python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具 文章目录 python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具项目背景技术栈用户界面核心功能实现结果展示完整代码总结 在现代软件开发中,测试接口的有效性与响应情况变得尤为重要。本文将指导…

MySQL社区版的启动与连接

1.启动: 注意:MySQL是默认开机自启的 方式一: 1.WinR 的命令行中直接输入services.msc 2.在服务中找到数据库名称,然后鼠标右键点击启动 方式二: 1.在开始选项中搜索“cmd”命令提示符,使用管理员身份运行 …

《Python浪漫的烟花表白特效》

一、背景介绍 烟花象征着浪漫与激情,将它与表白结合在一起,会创造出别具一格的惊喜效果。使用Python的turtle模块,我们可以轻松绘制出动态的烟花特效,再配合文字表白,打造一段专属的浪漫体验。 接下来,让…

【Linux学习】【Ubuntu入门】1-8 ubuntu下压缩与解压缩

1.Linux系统下常用的压缩格式 常用的压缩扩展名:.tar、.tar.bz2、.tar.gz 2.Windows下7ZIP软件安装 Linux系统下很多文件是.bz2,.gz结尾的压缩文件。 3.Linux系统下gzip压缩工具 gzip工具负责压缩和解压缩.gz格式的压缩包。 gzip对单个文件进行…

Ubuntu问题 -- 允许ssh使用root用户登陆

目的 新重装的系统, 普通用户可以使用ssh登陆服务器, 但是root不能使用ssh登陆 方法 vim 编辑ssh配置文件 sudo vim /etc/ssh/sshd_config找到 PermitRootLogin 这一行, 把后面值改成 yes 重启ssh sudo service sshd restart然后使用root账号登陆即可

最新智能AI问答运营系统(SparkAi)一站式AIGC系统,GPT-4.0/GPT-4o多模态模型+联网搜索提问+AI绘画+管理后台,用户会员套餐

目录 一、文章前言 系统介绍文档 二、功能模块介绍 系统快速体验 三、系统功能模块 3.1 AI全模型支持/插件系统 AI大模型 多模态模型文档分析 多模态识图理解能力 联网搜索回复 3.2 AI智能体应用 3.2.1 AI智能体/GPTs商店 3.2.2 AI智能体/GPTs工作台 3.2.3 自定义…

Redis面试篇笔记(持续更新)

一、redis主从集群 单节点redis的并发能力是由上限的,要进一步提高redis的并发能力可以搭建主从集群,实现读写分离,一主多从,主节点写数据,从节点读数据 部署redis主从节点的docker-compose文件命令解析 version: &q…

Logback实战指南:基础知识、实战应用及最佳实践全攻略

背景 在Java系统实现过程中,我们不可避免地会借助大量开源功能组件。然而,这些组件往往功能丰富且体系庞大,官方文档常常详尽至数百页。而在实际项目中,我们可能仅需使用其中的一小部分功能,这就造成了一个挑战&#…

如何编译 Cesium 源码

如何编译 Cesium 源码 Cesium 是一个开源的 JavaScript 库,用于构建 3D 地球和地图应用程序。它提供了一套强大的 API 和工具,使开发者能够创建丰富的地理空间应用。本文将指导您如何从 GitHub 下载 Cesium 源码,并在本地进行编译。 TilesB…

短视频矩阵系统是什么?有什么功能?

短视频矩阵系统是什么?短视频矩阵系统是一个为视频创作者和运营者提供全面服务的综合平台,它涵盖了多账号管理、人工智能驱动的剪辑制作、定时自动发布功能、智能评论回复、跨平台流量引导及营销成果分析等多项功能。该系统利用先进的技术手段优化、管理…

鸿蒙实战:页面跳转传参

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙项目2.2 编写首页代码2.3 新建第二个页面 3. 测试效果4. 实战总结 1. 实战概述 本次实战,学习如何在HarmonyOS应用中实现页面间参数传递。首先创建项目,编写首页代码,实现按钮跳转至第二个页面并…

windows 和 linux检查操作系统基本信息

windows检查操作系统基本信息 systeminfolinux检查操作系统基本信息 获取系统位数 getconf LONG_BIT查询操作系统release信息 lsb_release -a查询系统信息 cat /etc/issue查询系统名称 uname -a

【WPF】Prism学习(九)

Prism Dependency Injection 1.Container Locator 1.1. Container Locator的引入: Container Locator是在Prism 8.0版本中新引入的一个特性。它的目的是为了帮助Prism框架摆脱对CommonServiceLocator的依赖,并解决一些必须回退到ServiceLocator模式的内…