zoukankan      html  css  js  c++  java
  • 动态执行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)
        

    代码要点:

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

    总结

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

  • 相关阅读:
    Solutions:Elastic SIEM
    Solutions:Elastic SIEM
    Solutions:Elastic SIEM
    Elasticsearch:设置Elastic账户安全
    Beats:通过Metricbeat实现外部对Elastic Stack的监控
    Kibana: 运用Data Visualizer来分析CSV数据
    Kibana:在Kibana中对数据进行深入分析
    Kibana:Canvas入门
    Elastic:创建你的第一个Elastic alert
    Elasticsearch:跨集群搜索 Cross-cluster search (CCS)
  • 原文地址:https://www.cnblogs.com/zhizhou/p/3354794.html
Copyright © 2011-2022 走看看