Ray
8/9/2018 - 6:06 AM

Python Script to Parse Arguemtns and Logging Setup

Use optparse to parse arguments and logging setup

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#
# Usage:
#     ./test_argparse.py -d -v subtest -a 1 --arg2 2
#

"""Python script contains logging setup and argparse"""

import argparse
import logging
import os
import sys

CURRENT_PATH = os.path.dirname(os.path.abspath(__file__))
SCRIPT_NAME = os.path.basename(__file__)

def log_init(root_path, name="app", debug=False, verbose=False):
    """Set up global logs"""
    log_format = "%(asctime)s %(process)s %(levelname)s [-] %(message)s"
    log_level = logging.INFO
    log_path = os.path.join(root_path, "log")
    if not os.path.exists(log_path):
        os.makedirs(log_path)

    if debug:
        log_level = logging.DEBUG
        log_file = os.path.join(log_path, "%s.debug.log" % name)
    else:
        log_file = os.path.join(log_path, "%s.log" % name)

    if verbose:
        logging.basicConfig(
                format=log_format,
                level=log_level)
    else:
        logging.basicConfig(
                format=log_format,
                level=log_level,
                filename=log_file)

def parse_sys_args(argv):
    """Parses commaond-line arguments"""
    parser = argparse.ArgumentParser(
        description="Demo for argparse")
    parser.add_argument(
        "-d", "--debug", action="store_true", dest="debug",
        default=False, help="Enable debug message.")
    parser.add_argument(
        "-v", "--verbose", action="store_true", dest="verbose",
        default=False, help="Show message in standard output.")

    subparsers = parser.add_subparsers(title="Avaliable commands")

    # Subparsers
    parser_sub = subparsers.add_parser("subtest")
    parser_sub.add_argument(
        "-a", "--arg1", dest="arg1", required=True,
        help="Demo for subparsers argument1")
    parser_sub.add_argument(
        "--arg2", dest="arg2", required=True,
        help="Demo for subparsers argument1")
    parser_sub.set_defaults(func=test_parser_sub)

    return parser.parse_args(argv[1:])

def test_parser_sub(args):
    logging.info("arg1 is %s" % args.arg1)
    logging.debug("arg2 is %s" % args.arg2)

def main():
    args = parse_sys_args(sys.argv)
    log_init(CURRENT_PATH, SCRIPT_NAME, args.debug, args.verbose)
    args.func(args)

if __name__ == "__main__":
    main()