【发布时间】:2019-12-25 08:12:40
【问题描述】:
如何让 argparse 子解析器只解析它自己的参数?似乎在子解析器上调用parse_known_args 会解析所有父级的参数。
鉴于此简化版本,以及输入 foo bar:
main_parser = argparse.ArgumentParser()
main_parser.add_argument("command")
args, subc_args = main_parser.parse_known_args()
print("main parser = {}".format(args))
sub_parser = main_parser.add_subparsers()
sub_command_parser = sub_parser.add_parser("sub_command")
sub_command_parser.add_argument("hostname")
sub_args = sub_command_parser.parse_known_args()
print("sub parser = {}".format(sub_args))
第一次打印返回我所期望的:
main parser = Namespace(command='foo')
而倒数第二行返回相同的内容,只是将额外的参数作为“未知”列表的一部分:
sub parser = (Namespace(hostname='foo'), ['bar'])
我怎样才能得到像sub_command_parser.parse_known_args() 这样的东西来忽略它之前给出的参数?我需要sub_args 只包含那些用sub_command_parser.add_argument() 添加的参数。我可以像这样直接打电话给他们; sub_args[1],但这似乎很老套且不可靠。
背景:我将一个包拆分为一个主文件作为处理顶级参数的入口点,以及执行实际工作的模块。我想在主文件中添加顶级“主解析器”,并在模块中添加子解析器。
【问题讨论】:
-
parse_known_args()解析sys.argv[1:]列表。它不会从该列表中删除元素。通常我们调用main_parser,让它调用子解析器,剩下的参数。你可以试试sub_command_parser.parse_args(subc_args);也就是将第一个未知数提供给子解析器。而那个用途,不要打扰sub_parsers机制。只需定义子解析器。 -
另一种说法——如果你有多个解析器,每个解析器都会看到相同的
sys.argv[1:]。如果您想更改它,可以即时自定义sys.argv,或者使用argv列表调用parse_args。 -
谢谢@hpaulj,我已经在下面发布了答案。如果您想获得荣誉;)只需发布作为答案,我会将您的标记为解决方案。
标签: python python-3.x argparse