zhu894532094 发表于 2015-4-25 05:30:26

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

  代码要点:
  注意设置脚本的当前工作目录

总结
  这仅仅是一个很简单执行其他脚本的功能,如果要实现一个脚本的调度系统会比较复杂,因为需要考虑脚本与脚本之间有依赖关系,脚本的执行有触发条件等,这就需要根据实际情况来定了。
  
页: [1]
查看完整版本: 动态执行python脚本