| |
| |
| |
| |
|
|
| import argparse |
| from pathlib import Path |
|
|
| import yaml |
| import sys |
|
|
|
|
| class ArgumentParser(argparse.ArgumentParser): |
| """Simple implementation of ArgumentParser supporting config file |
| |
| This class is originated from https://github.com/bw2/ConfigArgParse, |
| but this class is lack of some features that it has. |
| |
| - Not supporting multiple config files |
| - Automatically adding "--config" as an option. |
| - Not supporting any formats other than yaml |
| - Not checking argument type |
| |
| """ |
|
|
| def __init__(self, *args, **kwargs): |
| super().__init__(*args, **kwargs) |
| self.add_argument("--config", help="Give config file in yaml format") |
|
|
| def parse_known_args(self, args=None, namespace=None): |
| |
| _args, _ = super().parse_known_args(args, namespace) |
| if _args.config is not None: |
| if not Path(_args.config).exists(): |
| self.error(f"No such file: {_args.config}") |
|
|
| with open(_args.config, "r", encoding="utf-8") as f: |
| d = yaml.safe_load(f) |
| if not isinstance(d, dict): |
| self.error("Config file has non dict value: {_args.config}") |
|
|
| for key in d: |
| for action in self._actions: |
| if key == action.dest: |
| break |
| else: |
| self.error(f"unrecognized arguments: {key} (from {_args.config})") |
|
|
| |
| |
| |
| self.set_defaults(**d) |
| return super().parse_known_args(args, namespace) |
|
|
|
|
| def get_commandline_args(): |
| extra_chars = [ |
| " ", |
| ";", |
| "&", |
| "(", |
| ")", |
| "|", |
| "^", |
| "<", |
| ">", |
| "?", |
| "*", |
| "[", |
| "]", |
| "$", |
| "`", |
| '"', |
| "\\", |
| "!", |
| "{", |
| "}", |
| ] |
|
|
| |
| argv = [ |
| arg.replace("'", "'\\''") |
| if all(char not in arg for char in extra_chars) |
| else "'" + arg.replace("'", "'\\''") + "'" |
| for arg in sys.argv |
| ] |
|
|
| return sys.executable + " " + " ".join(argv) |