#!/usr/bin/env python import ConfigParser import argparse import logging import os def type_loglevel(level): try: result = getattr(logging, level.upper()) except AttributeError: raise argparse.ArgumentTypeError("'%s' is not a valid log level. Please use %s" % (level, [x for x in logging._levelNames.keys() if isinstance(x, str)])) return result if __name__=='__main__': conf_parser = argparse.ArgumentParser( # Turn off help, so we print all options in response to -h add_help=False ) conf_parser.add_argument("-c", "--config", help="Specify a configuration file", metavar="FILE") args, remaining_argv = conf_parser.parse_known_args() defaults = { "foo" : "default foo value", "bar" : "default bar value", "baz" : "default baz value", "loglevel" : "INFO" } if args.config: config = ConfigParser.SafeConfigParser(defaults) config.read([args.config]) defaults = dict(config.items("Defaults")) for key in defaults.keys(): if "\n" in defaults[key]: defaults[key] = [x.strip() for x in defaults[key].splitlines()] # Don't suppress add_help here so it will handle -h parser = argparse.ArgumentParser( # Inherit options from config_parser parents=[conf_parser], # print script description with -h/--help description=__doc__, # Don't mess with format of description formatter_class=argparse.RawDescriptionHelpFormatter, ) parser.set_defaults(**defaults) parser.add_argument('-f', '--foo', help="Foo") parser.add_argument('-b', '--bar', help="Bar") parser.add_argument('-z', '--baz', help="Baz") parser.add_argument('-l', '--loglevel', type=type_loglevel, help='Log level verbosity') args = parser.parse_args(remaining_argv) logging.basicConfig(level=args.loglevel) print args