分享一個python啟動文件腳本(django示例)

今天給大家分享一個python啟動文件腳本

在日常開發中,我們常常需要運行多條命令來完成“靜態收集”“數據庫遷移”“啟動服務”……如果把這些命令整合到一個腳本里就好了

一、整體流程概覽

collect_static
upgrade_db
dev
dev
start
start
啟動腳本 main.py
環境準備
Django 初始化
action
收集靜態
數據庫遷移
開發模式啟動
生產模式啟動

二、腳本

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 年
🔗 原創整理,可自由轉載,請注明出處

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79390.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79390.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79390.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kubernetes》》K8S》》Pod的健康檢查

K8s概念總結 》》》Pod的生命周期階段 Pod的生命周期可以簡單描述:首先Pod被創建,緊接著Pod被調度到Node節點進行部署。 Pod是非常忠誠的,一旦被分配到Node節點后,就不會離開這個Node節點,直到它被刪除,刪除…

bininote: 使用AI將視頻轉換了Markdown筆記

GitHub:https://github.com/JefferyHcool/BiliNote 更多AI開源軟件:發現分享好用的AI工具、AI開源軟件、AI模型、AI變現 - 小眾AI BiliNote 是一個開源的 AI 視頻筆記助手,支持通過嗶哩嗶哩、YouTube 等視頻鏈接,自動提取內容并生…

鴻蒙NEXT開發文件預覽工具類(ArkTs)

import { uniformTypeDescriptor } from kit.ArkData; import { filePreview } from kit.PreviewKit; import { FileUtil } from ./FileUtil; import { AppUtil } from ./AppUtil; import { WantUtil } from ./WantUtil;/*** 文件預覽工具類* 提供文件預覽、加載、判斷等功能。…

MySQL常用SQL語句的示例

概述 MySQL 常用 SQL 語句的示例,涵蓋數據定義、操作、查詢等常見場景 一、數據庫操作 創建數據庫 CREATE DATABASE mydb;選擇數據庫 USE mydb;刪除數據庫 DROP DATABASE mydb;二、表操作 創建表 CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VAR…

智算啟新篇 安全筑新基 ——中國移動舉辦智算基礎設施及安全分論壇

4月10日,2025中國移動云智算大會智算基礎設施及安全分論壇在蘇州金雞湖國際會議中心揭幕。 在數字經濟浪潮奔涌向前的時代坐標下,中國移動錨定“創世界一流信息服務科技創新公司”定位,持續推進智算基礎設施建設,持續提升網信安全…

MySQL——游標(cursor)

一、什么是游標? 游標(Cursor) 是MySQL中用于逐行處理查詢結果集的數據庫對象。它類似于指針,允許開發者在結果集中逐行移動,并對每一行數據進行特定操作。游標將傳統的集合操作轉換為面向過程的記錄處理方式&#xf…

異步編程——微信小程序

1. 前言 引用來自:微信小程序開發中的多線程處理與異步編程_微信小程序 多線程-CSDN博客 微信小程序是基于JavaScript開發的,與瀏覽器JavaScript不同,小程序運行在WebView內部,沒有多線程的概念。小程序的 JavaScript 是單線程的…

HarmonyOS-ArkUI V2狀態-PersistenceV2:持久化存儲UI狀態

PersistenceV2類是一個與AppStorageV2類用法非常相似的類。因為它倆是子類和父類的關系。如果不了解AppStorageV2,可以先跳轉至了解一下這個類。 HarmonyOS-ArkUI V2工具類:AppStorageV2:應用全局UI狀態存儲-CSDN博客 PersistenceV2相比于其父類AppStorageV2而言,它存儲的…

《Mycat核心技術》第22章:搭建Mycat+Zookeeper+HAProxy+Keepalived+MySQL高可用架構

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章匯總:https://binghe.gitcode.host/md/all/all.html 星球項目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

Aosp13 文件應用點擊apk無反應的處理

最近遇到一個問題,在A13上,打開文件管理應用時,點擊apk 無反應或者啟動安裝進程后安裝完成或取消安裝進程,再次點擊apk 無反應。在此記錄該問題。 做一下修改:root/package/ providers/DownloadProvider/下 jenkinsdel…

SQL刷題記錄貼

1.題目:現在運營想要對用戶的年齡分布開展分析,在分析時想要剔除沒有獲取到年齡的用戶,請你取出所有年齡值不為空的用戶的設備ID,性別,年齡,學校的信息。 錯誤:select device_id,gender,age,un…

【Windows本地部署n8n工作流自動平臺結合內網穿透遠程在線訪問】

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

python爬蟲降低IP封禁,python爬蟲除了使用代理IP和降低請求頻率,還有哪些方法可以應對IP封禁?

文章目錄 前言1. 利用 CDN 節點2. 模擬真實用戶行為3. 使用 IP 池輪換策略4. 處理 Cookie 和會話信息5. 分布式爬蟲 前言 除了使用代理 IP 和降低請求頻率,以下這些方法也能應對 IP 封禁: Python 3.13.2安裝教程(附安裝包)Python…

光譜相機的成像方式

光譜相機的成像方式決定了其如何獲取物體的空間與光譜信息,核心在于分光技術與掃描模式的結合。以下是主要成像方式的分類解析: ?一、濾光片切換型? ?1. 濾光片輪(Filter Wheel)? ?原理?:通過旋轉裝有多個窄帶…

AI在市場營銷分析中的核心應用及價值,分場景詳細說明

以下是 AI在市場營銷分析中的核心應用及價值,分場景詳細說明: 1. 客戶行為分析與細分 AI技術應用: 機器學習:分析用戶點擊、購買、瀏覽等行為數據,識別消費模式(如高頻購買時段、偏好品類)。聚…

潯川AI翻譯v7.0更新預告

親愛的潯川AI翻譯用戶: 感謝您一直以來的支持!潯川AI翻譯自推出以來,已迭代6個版本,其中**v2.0和v4.0因技術問題(翻譯結果顯示異常、注冊失敗、密碼找回功能失效等)**被迫下架。我們深知這些問題影響了您…

LabVIEW中二維數組轉換為彩色圖

在 LabVIEW 編程環境下,有用戶想把二維數組轉化為彩色圖片。通過附件的程序示例,給出了具體實現方法,包括對數據的處理以及顏色映射的設置等內容,還涉及解決數據范圍與顏色映射不匹配等問題。公司官網有源碼 程序功能及細節 功能&…

【模型常見評價指標(分類)】

目錄 常見指標 其他的評估指標 3.1 BLEU 3.2 ROUGE 3.3 困惑度PPL(perplexity) 常見指標 其他的評估指標 3.1 BLEU BLEU(Bilingual Evaluation Understudy,雙語評估替補)分數是評估一種語言翻譯成另一種語言的文本質量的指標。它將“質…

期貨數據API對接實戰指南

一、期貨數據接口概述 StockTV提供全球主要期貨市場的實時行情與歷史數據接口,覆蓋以下品種: 商品期貨:原油、黃金、白銀、銅、天然氣、農產品等金融期貨:股指期貨、國債期貨特色品種:馬棕油、鐵礦石等區域特色期貨 …

TCP連接建立:為什么是三次握手?

接下來,以三個方面分析三次握手的原因: 1、三次握手才可以阻止重復歷史連接的初始化(主要原因) 2、三次握手才可以同步雙方的初始化序列號 3、三次握手才可以避免資源浪費 原因一:避免歷史連接 簡單來說&#xff0…