from abc import ABCMeta, abstractmethod import argparse import os import sys import inspect import re import importlib import Object import log class Cmd(Object.Object): # export __metaclass__=ABCMeta @abstractmethod def run(self, args): pass def __init__(self, name, help): self.name = name self.help = help def _run(self, args): pass def add_parser(self, parsers): r = parsers.add_parser(self.name, help=self.help, formatter_class=argparse.ArgumentDefaultsHelpFormatter) r.set_defaults(func=self.run) return r def run_sub_commands(description = '', filter = '^Cmd.*', modules=None): # export parser = argparse.ArgumentParser(usage=os.path.basename(sys.argv[0]) + ' [command] [options]', formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=description) parser.add_argument('--log-level', help='Log level', default='notice') parser.add_argument('--log-flags', help='Log flags', default='stderr,position,prio,color') subparsers = parser.add_subparsers(title='Available commands', metavar='') if modules == None: modules = [ '__main__' ] for m in modules: if m != '__main__': importlib.import_module(m) for name, c in inspect.getmembers(sys.modules[m], inspect.isclass): if not re.match(filter, name): continue if inspect.isabstract(c): continue c().add_parser(subparsers) args = parser.parse_args() log.set_level(args.log_level) log.set_flags(args.log_flags) args.func(args)