定义subparser的常用方法是
master_parser = argparse.ArgumentParser()
subparsers = master_parser.add_subparsers()
parser = subparsers.add_parser('sub')
parser.add_argument('--subopt')
将使用
调用subparsercommand sub --subopt
我正在实现一个调用多个转换器的包。如果我使用通常的subsparser方法,我将不得不做
convert ext1_to_ext2 file.ext1 file.ext2 --args
由于用户可能会调用
,因此重复且容易出错convert ext1_to_ext3 file.ext1 file.ext2 --args
我更希望从主解析器自动确定subparser,以便用户可以使用命令
convert file.ext1 file.ext2 EXTRA
和argparse
将确定来自ext1_to_ext2
和file.ext1
的子分析器file.ext2
,并调用子分析器ext1_to_ext2
来解析EXTRA
。当然EXTRA
这里是subparser特定的。
我尝试为每个转换器使用参数组(add_argument_group
),但参数组中的参数不能重叠,我得到了来自所有解析器的组合参数的杂乱列表,因此使用subparser似乎是通往去。
我尝试将parse_known_args
与两个位置参数一起使用,确定并使用适当的subparser来解析剩余的args,但很难从帮助消息中为用户提供转换器列表及其参数。
有办法做到这一点吗?
答案 0 :(得分:1)
推断使用subparser是棘手的,因为它需要在检查以下每个参数时重新实现argparse
本身使用的大量逻辑。
更简单的方法是使用subparser命令,它可以让您“检查”以下参数,以确保它们使用正确的参数。例如
# This allows a file name ending with any of the given extensions,
# or allows "file.1" in place of "file.1.jpg"
def jpeg_file(s):
for ext in ("jpg", "jpeg"):
if s.endswith(ext) or os.path.exists("%s.%s" % (s, ext)):
return s
raise argparse.ArgumentTypeError()
def tiff_file(s):
# similar to jpeg_file
master_parser = argparse.ArgumentParser()
subparsers = master_parser.add_subparsers()
jpg_to_tiff_parser = subparsers.add_parser('sub')
jpg_to_tiff_parser = parse.add_argument('jpg', type=jpg_file)
jpg_to_tiff_parser = parse.add_argument('tiff', type=tiff_file)
答案 1 :(得分:0)
在我看来,这让你有了更多的控制权。它正朝着你的要求前进。只需添加文件扩展名检查即可。
wsl.exe
如果没有别的,它会显示如何处理不同图层的帮助文本。