动态执行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)
代码要点:
注意设置脚本的当前工作目录
总结
这仅仅是一个很简单执行其他脚本的功能,如果要实现一个脚本的调度系统会比较复杂,因为需要考虑脚本与脚本之间有依赖关系,脚本的执行有触发条件等,这就需要根据实际情况来定了。
http://www.cnblogs.com/ola2010/