前言
存在許多獨立的python腳本,這些腳本可能會增加,也可能會減少,現在需要按照某種順序調度這些程序。在python的standard library中,有一個模塊imp可以實現動態的調用pthon腳本,實現調用,imp需要知道腳本的module name,module path。
思路
(一) 所有的python腳本都要提供一個入口函數:
def main(args):#args為string,由腳本編寫者自行解析 return exit_code #-1失敗,其他成功
args是腳本運行需要的參數,參數為字符串,格式有腳本編寫者自行設定,自行解析。
(二) 建立2個表:script_list、script_log。
1. script_list用來記錄需要執行的腳本的信息。主要字段有:module_name,module_path,module_args。其中module_name,module_path是為模塊imp准備的,module_args是為函數main准備的。
2. script_log用來記錄腳本執行情況的日志。
(三)執行
1. 根據module_name,module_path調用腳本。
2. 然后執行腳本的main函數,並把module_args傳給main函數
3. 將執行的結果記錄日志(這一步可以根據實際情況編寫)
實現
表的實現可以由多種方式。可以通過數據庫,也可以僅僅是一個配置文件,這個可以根據實際情況編寫。所以主要關注如何實現python腳本的調度。
代碼如下:
import sys,imp,os,traceback def load(module_name,module_path): '''使用imp的兩個函數find_module,load_module來實現動態調用Python腳本。 如果發現異常,需要解除對文件的占用 ''' fp, pathname, description=imp.find_module(module_name,[module_path]) try: return imp.load_module(module_name,fp,pathname,description) finally: if fp: fp.close() def do(module_name,module_path,module_args): '''在這個過程中用到3個模塊,其做用分別是: sys:添加library的path,因為有的腳本會調用其他的腳本,如果沒有將腳本的路徑添加到path,會調用失敗。 os:設置當前的工作目錄為腳本的目錄 traceback:如果腳本異常,獲取異常信息 ''' #設置環境 sys.path.append(module_path) default_cwd=os.getcwd() os.chdir(module_path) #調用與執行 try: do=load(module_name,module_path) exit_code=do.main(module_args) if exit_code==-1: print('execute error')#可以修改 except: vtype,value,trace=sys.exc_info() error_string=traceback.format_exception(vtype,value,trace) print(error_string)#可以修改,用於記錄異常信息 #還原環境 sys.path.pop() os.chdir(default_cwd)
代碼要點:
注意設置腳本的當前工作目錄
總結
這僅僅是一個很簡單執行其他腳本的功能,如果要實現一個腳本的調度系統會比較復雜,因為需要考慮腳本與腳本之間有依賴關系,腳本的執行有觸發條件等,這就需要根據實際情況來定了。
