from argparse import ArgumentParser from importlib import import_module import sys class BaseCommand: def outer_handle(self, args): parser = self._create_parser() options = parser.parse_args(args) return self.handle(**vars(options)) def handle(self, *args, **options): raise NotImplementedError def _create_parser(self): parser = ArgumentParser() self.add_arguments(parser) return parser def add_arguments(self, parser): """ Entry point for subclassed cli to add custom arguments. """ pass def call_command(cmd, *args): try: module = import_module(f'otree.cli.{cmd}') except ModuleNotFoundError: sys.exit(f"No command named '{cmd}'") module.Command().outer_handle(args)