动态执行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)
    

代码要点:

注意设置脚本的当前工作目录

总结

这仅仅是一个很简单执行其他脚本的功能,如果要实现一个脚本的调度系统会比较复杂,因为需要考虑脚本与脚本之间有依赖关系,脚本的执行有触发条件等,这就需要根据实际情况来定了。

 

posted @ 2013-10-06 22:59  zhizhou  阅读(5646)  评论(0编辑  收藏  举报