• 一个好用的python命令开发框架


    概述

    开发命令行入口main.py

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    
    
    import argparse
    import logging
    import os
    
    
    from gx.action.publish_cmc import publish_rpm_func
    from gx.data.global_vars import GlobalVars
    
    
    verbose = os.environ.get('VERBOSE')
    log = logging.getLogger('gxtool')
    
    log.setLevel(level=logging.DEBUG)
    handler = logging.StreamHandler()
    if verbose == '1':
        handler.setLevel(logging.DEBUG)
    else:
        handler.setLevel(logging.INFO)
    str_log = '[%(levelname)s %(asctime)s %(filename)s:%(lineno)d] %(message)s'
    formatter = logging.Formatter(str_log)
    handler.setFormatter(formatter)
    log.addHandler(handler)
    
    log.debug('VERBOSE={}'.format(verbose))
    
    
    cur_path = os.path.realpath(__file__)
    log.debug("cur_path: {}".format(cur_path))
    
    VERSION = '0.8.3-4'
    RELEASE_NOTE = """
    ==============================================================================
    date        version                   info
    ------------------------------------------------------------------------------
                0.6.0-1   init-dep解耦和拆分,enable-repofile、init-dep、copy-conf
    ==============================================================================
    """
    
    PARAMS = GlobalVars()
    PARAMS.put('gxtool_dir', cur_path)
    PARAMS.put('version', VERSION)
    PARAMS.put('release_note', RELEASE_NOTE.strip('
    '))
    
    
    def welcome():
        print("""
    Welcome!
    This is the main program for gxtool function. 
    It provides many features, and you can use 'gxtool --help' to check. 
    
    Thank you!
    Copyright (c) Huawei Technologies Co., Ltd. 2012-2020. All rights reserved.
    """)
    
    
    def add_commands():
        """
        Process command line options and return
        an argparse object containing all arguments
    
        :return: all the arguments parsed into the object
        :rtype: an argparse object
        """
        parser = argparse.ArgumentParser(prog='gxtool',
                                         description="Develop tool for gx project")
        parser.add_argument('-v', '--version', action="version",
                            version="Version: {}".format(VERSION))
        desc = 'Subcommands for gxtool. ' 
               'Use "gxtool [subcmd] --help" for detail usage.'
        sub_parser = parser.add_subparsers(title='subcommands',
                                           description=desc,
                                           dest="subparser_name"
                                           )
        # 环境检查
        add_env_parser(sub_parser)
        # 版本信息
        add_info_parser(sub_parser)
    
        # 编译核心
        add_dep_parser(sub_parser)
        add_copy_conf_parser(sub_parser)
        add_source_parser(sub_parser)
    
        # 发布cmc
        add_publish_parser(sub_parser)
        add_publish_comp_parser(sub_parser)
    
        # 查询repo信息
        add_check_repo_parser(sub_parser)
        add_check_local_repo_parser(sub_parser)
        add_search_rpm_parser(sub_parser)
        add_download_rpm_parser(sub_parser)
        add_extract_rpm_parser(sub_parser)
        show_repo_rpm_parser(sub_parser)
        # 更新本地repo文件
        update_repo_info_parser(sub_parser)
    
        args = parser.parse_args()
    
        PARAMS.update(vars(args))
        log.debug(PARAMS.get_all())
        func_name = PARAMS.get("func")
        log.debug('func_name: {}'.format(func_name))
        if func_name:
            func_name()
        else:
            welcome()
    
    
    def add_env_parser(sub_parser):
        help_info = 'check essential for current env.'
        env_parser = sub_parser.add_parser('env-check',
                                           help=help_info)
        env_parser.set_defaults(func=env_check_func)
    
    
    def add_copy_conf_parser(sub_parser):
        """
        add subcommand parser for copy-conf
    
        :param: sub_parser: the subcommand parser for gxtool
        :return:
        """
        dep_parser = sub_parser.add_parser('copy-conf',
                                           help='resolve build_conf for project')
        dep_parser.add_argument('-c', '--build_conf',
                                required=True,
                                help='project build_conf path')
        dep_parser.add_argument('-d', '--dest_path',
                                required=True,
                                help='spec file path and name')
    
        dep_parser.set_defaults(func=copy_conf_func)
    
    def main():
        add_commands()
    
    
    if __name__ == "__main__":
        main()
    

      一个单例类 global_vars.py:

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    
    class GlobalVars(object):
        """
        Singleton class GlobalVars to store and manage global variables.
        """
    
        _instance = None
        _var_dict = {}
    
        def __new__(cls, *args, **kw):
            """
            Ensure that when creating a new instance, it'll be the only
            instance. Otherwise return existing instance.
    
            :param args:
            :param kw:
            :return: cls._instance
            """
    
            if not cls._instance:
                cls._instance = super(GlobalVars, cls).__new__(cls, *args, **kw)
            return cls._instance
    
        def get(self, var_name):
            """
            Get the global variable value from var dict.
    
            :param var_name:
            :return: self._var_dict[var_name] or None
            """
    
            if var_name in self._var_dict.keys():
                return self._var_dict[var_name]
            return None
    
        def put(self, key, value):
            """
            Put a pair of key/value into var dict.
    
            :param key, value:
            :return: None
            """
    
            self._var_dict.update({key: value})
    
        def update(self, var_dict):
            """
            Update the _var_dict with a dict of key/values.
            :param var_dict:
            :return:
            """
    
            if isinstance(var_dict, dict):
                self._var_dict.update(var_dict)
    
        def get_all(self):
            return self._var_dict
    
        def save(self):
            """
            Save the _var_dict in local file.
            :param var_dict:
            :return:
            """
            pass
    
        def refresh(self):
            """
            init the _var_dict from local file.
            :param var_dict:
            :return:
            """
            pass
    

      一个最简单基础类 utils.py:

    class BaseMethod:
    
        @staticmethod
        def run_cmd(cmd):
            retcode, output = subprocess.getstatusoutput(cmd)
            if retcode != 0:
                print("RUN CMD: %s, retcode: %s, output: %s"
                      % (cmd, retcode, output))
            return retcode, output
    
        @staticmethod
        def write_file(filename, content):
            dir_name = os.path.dirname(filename)
            if not os.path.exists(dir_name):
                os.makedirs(dir_name)
            with open(filename, 'w', encoding='utf-8') as tf:
                tf.write(content)
    
        @staticmethod
        def read_file_with_json(file_name, mode="r"):
            if not os.path.exists(file_name):
                raise IOError("No such file or directory: %s" % file_name)
            with open(file_name, mode) as fp:
                json_body = json.load(fp)
            return json_body
    
        @staticmethod
        def write_json_to_file(file_name, json_body, mode="w+"):
            # json_body 要求是字典
            with tempfile.NamedTemporaryFile(mode, dir=os.path.dirname(file_name),
                                             delete=False) as fp:
                json_str = json.dumps(json_body, indent=4, sort_keys=True)
                fp.write(json_str)
                fp.flush()
                temp_name = fp.name
            os.rename(temp_name, file_name)
    
        @staticmethod
        def get_md5sum(file_name):
            cmd = 'md5sum {}'.format(file_name)
            ret, out = BaseMethod.run_cmd(cmd)
            md5sum = ''
            if ret == 0:
                md5sum = out.split()[0]
            return md5sum
    

      

  • 相关阅读:
    正则表达式实例:取得普陀区所有的小区名字和地址
    VS的注释(TODO)
    用本地地址构造出多个虚拟域名
    设置asp.net网站的信任等级
    c#中的多线程和异步处理
    VS2010下MVC4安装
    4、学习《细说PHP》笔记四
    38、UMLet的使用与类图的设计
    1、学习《细说PHP》笔记一
    6、学习《细说PHP》笔记六
  • 原文地址:https://www.cnblogs.com/kelvinchiang/p/12363316.html
Copyright © 2020-2023  润新知