我正在尝试扩展argparse以使其与配置文件以及CLI参数一起使用。我想从配置文件中传递所有选项,但如果有未知选项,则不退出。我的想法是先调用新选项上的parse_known_args
,然后调用用parse_known_args
再次显示sys.argv
。这使我可以警告配置文件中的未知选项,而不是CLI上的选项。但是,如果没有足够的参数,则在第一次调用parse_known_args
之后argparse退出。有没有办法告诉它不退出?
我的代码如下:
class Parser(argparse.ArgumentParser):
def parse_known_args(self, args=None, namespace=None):
config = {}
for file in get_config_files(self.prog):
for key, value in try_parse(file, self.default_ext).items():
config[key] = value, file
new_args = []
for key, (val, _) in config.items():
new_args.append('--' + key)
new_args.append(val)
# override configuration with argparse's builtin parsing
# makes CLI options take precedence over config files
# ----- This is where argparse exits -----
parsed_config, unknown = super().parse_known_args(new_args, namespace)
#print("finished first call to known_args")
for key in unknown[::2]:
key = key[2:]
_, filename = config[key]
warnings.warn("unknown option '%s' (from %s)" % (key, filename))
#print(parsed_config)
return super().parse_known_args(args, parsed_config)
示例用法如下所示:
>>> from pyautoconfig import Parser >>> p = Parser(prog='test') >>> p.add_argument('positional') _StoreAction(option_strings=[], dest='positional', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None) >>> p.parse_args(['positional arg']) usage: test [-h] positional test: error: the following arguments are required: positional
请注意,即使我传递了位置参数,它也会以错误退出。如何避免这种情况?我找到了How to call parse_args() twice on the same set of arguments in Python's argparse?,但是处理的参数太多,而不是太多(推荐的解决方案是使用
parse_known_args
)。
如果有帮助,完整代码为on GitHub。
我正在尝试扩展argparse以使其与配置文件以及CLI参数一起使用。我想从配置文件中传递所有选项,但如果有未知选项,则不退出。我的想法是...
新代码: