
最新動(dòng)態(tài)
Python如何創(chuàng)建一個(gè)自動(dòng)化腳本管理系統(tǒng)
2025-01-27Python自動(dòng)化腳本管理工具實(shí)現(xiàn)
每天都有大量的腳本需要運(yùn)行,并且還需要記住每個(gè)腳本應(yīng)該何時(shí)執(zhí)行,真是令人頭疼!干脆開發(fā)一個(gè)工具來管理這些腳本吧,讓它自動(dòng)執(zhí)行、監(jiān)控狀態(tài)并查看運(yùn)行日志,豈不快哉。
項(xiàng)目架構(gòu)設(shè)計(jì)
這個(gè)工具主要分為三個(gè)部分:腳本注冊管理、任務(wù)調(diào)度器和日志系統(tǒng)。簡單來說,就是告訴工具要執(zhí)行什么腳本、什么時(shí)候執(zhí)行以及執(zhí)行完畢后的狀態(tài)。
class ScriptManager:
def __init__(self):
self.scripts = {}
self.scheduler = {}
self.log_path = "script_logs/"
def register_script(self, name, path, schedule=""):
self.scripts[name] = {
"path": path,
"schedule": schedule,
"status": "idle"
}
腳本注冊功能
當(dāng)然,工具需要知道要管理哪些腳本。因此,我們需要編寫一個(gè)注冊函數(shù),用來記錄腳本的名字、路徑和執(zhí)行計(jì)劃。
def add_script(self, name, script_path):
if not os.path.exists(script_path):
raise FileNotFoundError("腳本文件不存在!")
self.scripts[name] = {
"path": script_path,
"last_run": None,
"status": "ready"
}
???? 溫馨提示:注冊腳本時(shí)最好檢查文件是否存在,以免運(yùn)行時(shí)找不到文件。
任務(wù)調(diào)度模塊
僅僅注冊腳本是不夠的,必須按照計(jì)劃執(zhí)行。這里我們可以使用schedule
庫來創(chuàng)建定時(shí)任務(wù),既簡單又實(shí)用。
import schedule
import time
from datetime import datetime
def setup_scheduler(self):
for name, info in self.scripts.items():
if info["schedule"]:
schedule.every().day.at(info["schedule"]).do(
self.run_script,
name
)
while True:
schedule.run_pending()
time.sleep(1)
腳本執(zhí)行器
執(zhí)行腳本時(shí)需要使用子進(jìn)程來運(yùn)行,以確保主程序不會(huì)被阻塞。同時(shí),還需要將輸出重定向到日志文件中。
def run_script(self, script_name):
script_info = self.scripts[script_name]
log_file = f"{self.log_path}{script_name}_{datetime.now():%Y%m%d_%H%M}.log"
try:
process = subprocess.Popen(
["python", script_info["path"]],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
output, error = process.communicate()
with open(log_file, "w") as f:
f.write(output.decode())
if error:
f.write("\nErrors:\n" + error.decode())
script_info["status"] = "completed" if process.returncode == 0 else "failed"
except Exception as e:
script_info["status"] = "error"
with open(log_file, "w") as f:
f.write(f"執(zhí)行出錯(cuò)啦:{str(e)}")
狀態(tài)監(jiān)控
需要了解腳本是否執(zhí)行成功,如果失敗了也應(yīng)及時(shí)發(fā)現(xiàn)。
def get_status(self):
status_info = {}
for name, info in self.scripts.items():
status_info[name] = {
"status": info["status"],
"last_run": info["last_run"]
}
return status_info
???? 溫馨提示:在監(jiān)控狀態(tài)時(shí)可以添加一個(gè)郵件通知功能,以便在腳本運(yùn)行失敗時(shí)能夠立即收到提醒。
使用示例
看看這個(gè)工具如何使用:
manager = ScriptManager()
# 注冊腳本
manager.add_script("數(shù)據(jù)備份", "/scripts/backup.py")
manager.add_script("日報(bào)生成", "/scripts/daily_report.py", "18:00")
# 啟動(dòng)調(diào)度器
manager.setup_scheduler()
# 查看狀態(tài)
print(manager.get_status())
至此,代碼已經(jīng)完成。現(xiàn)在再也不需要手動(dòng)運(yùn)行腳本,也不會(huì)忘記執(zhí)行時(shí)間。它不僅能夠自動(dòng)執(zhí)行,還能記錄日志,一旦出現(xiàn)問題可以迅速定位原因。
未來還可以為這個(gè)工具添加更多功能,例如Web界面管理和遠(yuǎn)程執(zhí)行腳本,這樣會(huì)更加便捷。