動態執行python腳本


前言

存在許多獨立的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)
    

代碼要點:

注意設置腳本的當前工作目錄

總結

這僅僅是一個很簡單執行其他腳本的功能,如果要實現一個腳本的調度系統會比較復雜,因為需要考慮腳本與腳本之間有依賴關系,腳本的執行有觸發條件等,這就需要根據實際情況來定了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM