如果没有足够的参数,我如何告诉argparse不退出?

问题描述 投票:2回答:1

我正在尝试扩展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参数一起使用。我想从配置文件中传递所有选项,但如果有未知选项,则不退出。我的想法是...

python argparse
1个回答
0
投票
我发现了一个骇客! Argparse仅在不存在以下必需操作时抛出错误:https://github.com/python/cpython/blob/3.8/Lib/argparse.py#L2033。因此,如果不需要采取任何措施,则不会引发任何错误。

新代码:

© www.soinside.com 2019 - 2024. All rights reserved.