分享一个python启动文件脚本(django示例)
今天给大家分享一个python启动文件脚本
在日常开发中,我们常常需要运行多条命令来完成“静态收集”“数据库迁移”“启动服务”……如果把这些命令整合到一个脚本里就好了
一、整体流程概览
二、脚本
import argparse
import logging
import os
import sys
import timeimport django
from django.core import management# 获取当前脚本所在的目录
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# 定义应用代码所在的目录为 'apps' 子目录
APP_DIR = os.path.join(BASE_DIR, 'apps')# 将当前工作目录切换到脚本所在的目录
os.chdir(BASE_DIR)
# 将 'apps' 目录添加到 Python 的模块搜索路径中,这样可以方便地导入 'apps' 目录下的模块
sys.path.insert(0, APP_DIR)
# 设置 Django 的 settings 模块。这是 Django 项目的核心配置文件。
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "smartdoc.settings")
# 初始化 Django 环境,只有初始化后才能使用 Django 的各种功能,比如模型、管理命令等。
django.setup()def collect_static():"""收集静态文件到指定目录本项目主要是将前端 vue/dist 的前端项目放到静态目录下面:return:"""logging.info("Collect static files")try:# 调用 Django 的 'collectstatic' 管理命令,用于将各个 app 中的静态文件收集到一个统一的目录中。# '--no-input':禁止用户交互式输入。# '-c':清除之前收集的静态文件。# verbosity=0:设置命令输出的详细程度,0 表示不输出额外信息。# interactive=False:进一步确保非交互式执行。management.call_command('collectstatic', '--no-input', '-c', verbosity=0, interactive=False)logging.info("Collect static files done")except:# 如果收集静态文件过程中发生任何异常,则忽略(pass),不影响后续流程。passdef perform_db_migrate():"""初始化数据库表"""logging.info("Check database structure change ...")logging.info("Migrate model change to database ...")try:# 调用 Django 的 'migrate' 管理命令,用于将 Django 模型的变化同步到数据库中,创建或更新数据库表结构。management.call_command('migrate')except Exception as e:# 如果数据库迁移过程中发生异常,记录错误日志并退出程序。logging.error('Perform migrate failed, exit', exc_info=True)sys.exit(11)def start_services():# 从命令行参数中获取要启动的服务列表,如果 'args.services' 是一个列表则直接使用,否则将其包装成一个列表。services = args.services if isinstance(args.services, list) else [args.services]start_args = []# 如果命令行参数中包含 '--daemon',则将其添加到启动参数列表中,表示以守护进程模式运行。if args.daemon:start_args.append('--daemon')# 如果命令行参数中包含 '--force',则将其添加到启动参数列表中,可能用于强制执行某些操作。if args.force:start_args.append('--force')# 如果命令行参数中包含 '--worker',则将其值(worker 数量)添加到启动参数列表中。if args.worker:start_args.extend(['--worker', str(args.worker)])else:# 如果命令行参数中没有指定 worker 数量,则尝试从环境变量 'CORE_WORKER' 中获取。worker = os.environ.get('CORE_WORKER')# 如果环境变量 'CORE_WORKER' 存在且是数字,则将其添加到启动参数列表中。if isinstance(worker, str) and worker.isdigit():start_args.extend(['--worker', worker])try:# 调用 Django 的管理命令来启动指定的服务。这里的 'action' 变量在主程序中根据命令行参数确定。# '*services' 和 '*start_args' 用于将列表中的元素作为独立的参数传递给 'call_command'。management.call_command(action, *services, *start_args)except KeyboardInterrupt:# 如果用户按下 Ctrl+C 中断程序,则记录信息并等待 2 秒后退出。logging.info('Cancel ...')time.sleep(2)except Exception as exc:# 如果启动服务过程中发生其他异常,记录错误日志并等待 2 秒后退出。logging.error("Start service error {}: {}".format(services, exc))time.sleep(2)def dev():# 从命令行参数中获取要运行的服务,与 'start_services' 类似。services = args.services if isinstance(args.services, list) else args.services# 如果要运行的服务包含 'web',则调用 Django 的 'runserver' 管理命令启动开发服务器,监听 0.0.0.0:8080。if services.__contains__('web'):management.call_command('runserver', "0.0.0.0:8080")# 如果要运行的服务包含 'celery',则调用 Django 的 'celery' 管理命令启动 Celery worker。elif services.__contains__('celery'):management.call_command('celery', 'celery')# 如果要运行的服务包含 'local_model',则设置环境变量 'SERVER_NAME' 为 'local_model',# 并从 'smartdoc.const' 模块的 'CONFIG' 字典中获取本地模型服务的主机和端口,# 然后调用 'runserver' 启动开发服务器监听指定的地址。elif services.__contains__('local_model'):os.environ.setdefault('SERVER_NAME', 'local_model')from smartdoc.const import CONFIGbind = f'{CONFIG.get("LOCAL_MODEL_HOST")}:{CONFIG.get("LOCAL_MODEL_PORT")}'management.call_command('runserver', bind)# 这是 Python 的主程序入口点,当脚本直接运行时会执行这里的代码。
if __name__ == '__main__':# 设置环境变量 'HF_HOME',这可能与脚本中使用的某个库(如 Hugging Face Transformers)有关,指定其配置文件的存储路径。os.environ['HF_HOME'] = '/opt/maxkb/model/base'# 创建一个 ArgumentParser 对象,用于解析命令行参数。parser = argparse.ArgumentParser(description="""qabot service control tools;Example: \r\n%(prog)s start all -d;""")# 添加一个名为 'action' 的位置参数,用户必须提供这个参数来指定要执行的操作。# 'type=str':指定参数类型为字符串。# 'choices':限定了 'action' 参数的可选值,包括 'start'(启动服务)、'dev'(开发模式)、'upgrade_db'(升级数据库)、'collect_static'(收集静态文件)。# 'help':参数的帮助信息。parser.add_argument('action', type=str,choices=("start", "dev", "upgrade_db", "collect_static"),help="Action to run")# 解析已知的命令行参数,将解析结果存储在 'args' 中,并将未知的参数存储在 'e' 中。args, e = parser.parse_known_args()# 根据不同的 'action' 值,为 'services' 参数设置不同的默认值和可选值。# 如果 'action' 是 'start',则 'services' 参数的默认值为 'all',可选值为 'all'、'web'、'task'。# 否则(如果 'action' 是 'dev'),则 'services' 参数的默认值为 'web',可选值为 'web'、'celery'、'local_model'。# 'nargs="*"':表示 'services' 参数可以接受零个或多个值,这些值将被存储在一个列表中。parser.add_argument("services", type=str, default='all' if args.action == 'start' else 'web', nargs="*",choices=("all", "web", "task") if args.action == 'start' else ("web", "celery", 'local_model'),help="The service to start",)# 添加可选参数 '-d' 或 '--daemon',用于指定是否以守护进程模式运行。'nargs="?"' 表示该参数可以有零个或一个值,'const=True' 表示如果只指定了该参数而没有提供值,则其值为 True。parser.add_argument('-d', '--daemon', nargs="?", const=True)# 添加可选参数 '-w' 或 '--worker',用于指定 worker 的数量。'type=int' 表示参数类型为整数,'nargs="?"' 与 '--daemon' 类似。parser.add_argument('-w', '--worker', type=int, nargs="?")# 添加可选参数 '-f' 或 '--force',用于指定是否强制执行某些操作,与 '--daemon' 类似。parser.add_argument('-f', '--force', nargs="?", const=True)# 解析所有的命令行参数,将最终的解析结果存储在 'args' 中。args = parser.parse_args()# 将解析得到的 'action' 参数的值赋给变量 'action'。action = args.action# 根据 'action' 的值执行相应的操作。if action == "upgrade_db":# 如果 'action' 是 'upgrade_db',则调用 'perform_db_migrate' 函数来执行数据库迁移。perform_db_migrate()elif action == "collect_static":# 如果 'action' 是 'collect_static',则调用 'collect_static' 函数来收集静态文件。collect_static()elif action == 'dev':# 如果 'action' 是 'dev',则先收集静态文件,然后执行数据库迁移,最后调用 'dev' 函数启动开发服务。collect_static()perform_db_migrate()dev()else:# 如果 'action' 不是以上任何值(通常是 'start'),则先收集静态文件,然后执行数据库迁移,最后调用 'start_services' 函数启动指定的服务。collect_static()perform_db_migrate()start_services()
、收益
运维同学只需记住一条命令。
CI/CD 管道中,只需执行一次脚本即可完成全部准备工作。
后续只要在脚本中新增命令分支,即可支持新的功能。
📌 作者:叫我DPT
📅 日期:2025 年
🔗 原创整理,可自由转载,请注明出处
相关文章:
分享一个python启动文件脚本(django示例)
今天给大家分享一个python启动文件脚本 在日常开发中,我们常常需要运行多条命令来完成“静态收集”“数据库迁移”“启动服务”……如果把这些命令整合到一个脚本里就好了 一、整体流程概览 #mermaid-svg-wA6UnfATaUOfJoPn {font-family:"trebuchet ms"…...
从0到1彻底掌握Trae:手把手带你实战开发AI Chatbot,提升开发效率的必备指南!
我正在参加Trae「超级体验官」创意实践征文, 本文所使用的 Trae 免费下载链接: www.trae.ai/?utm_source… 前言 大家好,我是小Q,字节跳动近期推出了一款 AI IDE—— Trae,由国人团队开发,并且限时免费体…...
3200温控板电路解析
提示:文章 文章目录 前言一、背景二、2.12.2 三、3.1 总结 前言 前期疑问: 本文目标: 一、背景 最近重温3200温控板电路设计和芯片选型 3200代码仓 二、 2.1 按照顺序整理,主要是依靠自己想到的来整理 1、传感器是pt1000&…...
opencv图片颜色识别,颜色的替换
图片颜色识别 1. RGB颜色空间2. 颜色加法2.1使用numpy对图像进行加法2.2使用opencv加法(cv2.add) 3 颜色加权加法(cv2.addWeighted())4. HSV颜色空间5. 制作掩膜4. 与运算(cv2.bitwise_and)5.颜色的替换7 R…...
B实验-12
需要注意版本、页面源代码 两个文件一个目录:phpinfo robots phpmyadmin 实验12 靶机1 一个key在phpmyadmin,一个key在回收站 用两个扫描目录的工具扫,nmap给python版 情况1:弱口令 root root root 123456 …...
Python多技术融合在生态参量估算中的创新应用—以蒸散发与植被GPP估算为例
在全球气候变化背景下,精确估算陆地生态系统水碳通量成为生态研究的关键命题。本研究创新性地整合Python编程、遥感数据处理、机器学习算法及生态过程模型,构建了一套高效可靠的蒸散发(ET)与植被总初级生产力(GPP&…...
文件有几十个T,需要做rag,用ragFlow能否快速落地呢?
一、RAGFlow的优势 1、RAGFlow处理大规模数据性能: (1)、RAGFlow支持分布式索引构建,采用分片技术,能够处理TB级数据。 (2)、它结合向量搜索和关键词搜索,提高检索效率。 …...
【网工第6版】第5章 网络互联②
目录 ■ IPV6 ▲ IPV6报文格式 ◎ IPV6扩展报头(RFC2460) ◎ IPv6相关协议 ▲ IPV6地址分类 ◎ IPv6地址基础 ◎ IPv6地址举例 ◎ IPv6地址分类 ◎ 特殊地址对比IPv4 vs IPv6 ▲ 过渡技术 本章重要程度:☆☆☆☆☆ ■ IPV6 与IPv4…...
为什么Makefile中的clean需要.PHONY
原因一:避免Makefile检查时间戳 前置知识:makefile在依赖文件没有改变时不会执行编译命令 #第一次执行,OK [rootVM-16-14-centos ~]# make g -E main.cc -o main.i g -S main.i -o main.s g -c main.s -o main.o g main.o -o main#第二…...
Vue组件库开发实战:从0到1构建可复用的微前端模块
🔥 随着前端项目越来越复杂,如何开发一个可以随处使用的组件库变得尤为重要。本文将带你从0开始,实现一个完全独立的Vue组件库,包含样式隔离、主题定制等核心功能。 前言 在日常开发中,我们经常需要在不同项目间复用组…...
相机标定(输出相机内参和畸变参数)
相机标定 这里我用笔记本电脑自带的摄像头进行相机标定 仅作示例,实际工程中要用对应的摄像头进行标定 同时代码也要相应的修改,不过修改的主要是相机的初始化 粗略的说就是打开相机那部分要修改(依据实际情况相应修改) 最终的结果…...
单页面应用的特点,什么是路由,VueRouter的下载,安装和使用,路由的封装抽离,声明式导航的介绍和使用
文章目录 一.什么是单页面应用?二.什么是路由?生活中的路由和Vue中的路由 三.VueRouter(重点)0.引出1.介绍2.下载与使用(5个基本步骤2个核心步骤)2.1 五个基本步骤2.2 两个核心步骤 四.路由的封装抽离五.声明式导航1.导航链接特点一:能跳转特点二:能高亮 2.两个高亮类名2.1.区…...
数字ic后端设计从入门到精通2(含fusion compiler, tcl教学)
上篇回顾 上一篇文章需要讨论了net,pin的基础用法,让我们来看一下高级一点的用法 instance current_instance current_instance 是 Synopsys 工具(如 Fusion Compiler 或 Design Compiler)中用于在设计层次结构中导航的关键命令。它允许用…...
STM32---外部中断EXTI
目录 一、中断向量表 二、EXTI工作原理图 三、NVIC模块 四、GPIO设置为EXTI的结构 五、C语言示例代码 在STM32中,中断是一个非常重要的结构,他能让我们在执行主函数的时候,由硬件检测一些外部或内部产生的中断信号,跳转到中断…...
Itext进行PDF的编辑开发
这周写了一周的需求,是制作一个PDF生成功能,其中用到了Itext来制作PDF的视觉效果。其中一些功能不是很懂,仅作记录,若要学习请仔细甄别正确与否。 开始之前,我还是想说,这傻福需求怎么想出来的,…...
Hibernate的组件映射
在实际的开发中,使用的是非常多的,还有几种比较特殊的关系映射: 组件映射继承映射 先看一下组件映射: 组件映射中, 组件也是一个类, 但是这个类它不独立称为一个实体, 也就是说, 数据库中没有一个表格单独的和它对应, 具体情况呢, 看演示:...
C++ 操作符重载Operator
C可以重载大多数操作符,如算术运算符号,-号。 位操作符<<,>> 下标符号[]等都可以重载。 重载的意思,是让这些符号,按你定义的行为来执行代码,但是这种自定义,是有限制的,必须有一…...
Docker 镜像、容器和 Docker Compose的区别
前言:Docker 的镜像、容器和 Docker Compose 是容器化技术的核心组件,以下是对它们的详细解析及使用场景说明。 1、Docker 镜像(Image) 定义: 镜像是只读模板,包含运行应用程序所需的代码、…...
Linux深度探索:进程管理与系统架构
1.冯诺依曼体系结构 我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。 截至目前,我们所认识的计算机,都是由⼀个个的硬件组件组成。 输入设备:键盘,鼠标…...
一段式端到端自动驾驶:VAD:Vectorized Scene Representation for Efficient Autonomous Driving
论文地址:https://github.com/hustvl/VAD 代码地址:https://arxiv.org/pdf/2303.12077 1. 摘要 自动驾驶需要对周围环境进行全面理解,以实现可靠的轨迹规划。以往的方法依赖于密集的栅格化场景表示(如:占据图、语义…...
17.整体代码讲解
从入门AI到手写Transformer-17.整体代码讲解 17.整体代码讲解代码 整理自视频 老袁不说话 。 17.整体代码讲解 代码 import collectionsimport math import torch from torch import nn import os import time import numpy as np from matplotlib import pyplot as plt fro…...
把dll模块注入到游戏进程的方法_基于文件修改的注入方式
1、概述 本文主要是介绍两种基于文件修改的注入方式,一种是“DLL劫持”,另一种是“修改导入表”。这两种注入方式都是利用操作系统加载PE时的特点来实现的,我们在实现这两种注入方式时只需专注于注入dll的实现,而不用花费额外的精力去关注注入器的实现。要想深入了解这两种…...
4月21日星期一今日早报简报微语报早读
4月21日星期一,农历三月廿四,早报#微语早读。 1、女子伸腿阻止列车关门等待同行人员,被深圳铁路警方行政拘留; 2、北理工再通报:开除宫某党籍,免去行政职务,解除聘用关系; 3、澳门…...
Spark(20)spark和Hadoop的区别
Apache Spark 和 Apache Hadoop 都是广泛使用的开源大数据处理框架,但它们在设计理念、架构、性能和适用场景等方面存在显著区别。以下是它们的主要区别: ### **1. 架构设计** - **Hadoop**: - **HDFS(Hadoop Distributed File…...
Kubeflow 快速入门实战(二) - Pipelines / Katib / KServer
承接前文博客 Kubeflow 快速入门实战(一) Kubeflow 快速入门实战(一) - 简介 / Notebooks-CSDN博客文章浏览阅读441次,点赞19次,收藏6次。本文主要介绍了 Kubeflow 的主要功能和能力,适用场景,基本用法。以及Notebook,…...
【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(一)
本篇博客给大家带来的是多线程中常见的所策略和CAS知识点. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 要开心要快…...
ECA 注意力机制:让你的卷积神经网络更上一层楼
ECA 注意力机制:让你的卷积神经网络更上一层楼 在深度学习领域,注意力机制已经成为提升模型性能的重要手段。从自注意力(Self-Attention)到各种变体,研究人员不断探索更高效、更有效的注意方法。今天我们要介绍一种轻…...
基于定时器查询模式的LED闪烁(STC89C52单片机)
#include <reg52.h> sbit LED P0^0; sbit ADDR0 P1^0; sbit ADDR1 P1^1; sbit ADDR2 P1^2; sbit ADDR3 P1^3; sbit ENLED P1^4; void main() { unsigned char cnt 0; //定义一个计数变量,记录T0溢出次数 ENLED 0; //使能U3,选择…...
SAP系统生产跟踪报表入库数异常
生产跟踪报表入库数异常 交库21820,入库43588是不可能的 原因排查: 报表的入库数取值,是取移动类型321 (即系检验合格后过账到非限制使用)的数. 查凭证,101过账2次21807,321过账了2次21794,然后用102退1次21794.就是说这批物料重复交库了. 解决: 方案一:开发增强设…...
Kubernetes控制平面组件:调度器Scheduler(一)
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
