【发布时间】:2023-10-13 03:15:01
【问题描述】:
定义子解析器的通常方法是做
master_parser = argparse.ArgumentParser()
subparsers = master_parser.add_subparsers()
parser = subparsers.add_parser('sub')
parser.add_argument('--subopt')
子解析器会被调用
command sub --subopt
我正在实现一个调用多个转换器的包。如果我使用通常的子解析器方法,我将不得不这样做
convert ext1_to_ext2 file.ext1 file.ext2 --args
这既重复又容易出错,因为用户可能会调用
convert ext1_to_ext3 file.ext1 file.ext2 --args
我更希望从主解析器自动确定子解析器,以便用户可以使用命令
convert file.ext1 file.ext2 EXTRA
和argparse 将从file.ext1 和file.ext2 中确定子解析器ext1_to_ext2,并调用子解析器ext1_to_ext2 来解析EXTRA。当然EXTRA 这里是子解析器特定的。
我尝试为每个转换器 (add_argument_group) 使用参数组,但参数组中的参数不能重叠,并且我得到了来自所有解析器的组合参数的混乱列表,因此使用子解析器似乎是要走的路。
我尝试将parse_known_args 与两个位置参数一起使用,确定并使用适当的子解析器来解析剩余的参数,但很难从帮助消息中为用户提供转换器列表及其参数。
有没有办法做到这一点?
【问题讨论】:
-
你能用
parse_known_args吗?这将让您解析参数的第一部分,自己评估正确的子解析器,然后将剩余的参数传递给正确的子解析器。 -
这是我现在正在采取的方法,但我正在努力为用户提供帮助信息。看来我需要劫持
convert file.ext1 file.ext2 -h以打印来自另一个解析器的帮助消息,但我仍然无法列出来自convert -h的所有可用转换器(也许epilog可以工作)。 -
你要求的那种逻辑对于
argparse来说是不合理的。要么直接解析sys.argv,要么通过argparse获取简单字符串的值,然后推断你应该采取什么行动。
标签: python argparse subparsers