最新動(dòng)態(tài)

Python如何創(chuàng)建一個(gè)自動(dòng)化腳本管理系統(tǒng)

2025-01-27

Python自動(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ì)更加便捷。