定义子解析器通常是这样做的
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 EXTRAargparse将从file.ext1和file.ext2中确定子解析器ext1_to_ext2,并调用子解析器ext1_to_ext2来解析EXTRA。当然,这里的EXTRA是特定于子解析器的。
我尝试为每个转换器(add_argument_group)使用参数组,但参数组中的参数不能重叠,并且我从所有解析器获得了一个混乱的组合参数列表,因此使用子解析器似乎是可行的。
我尝试使用带有两个位置参数的parse_known_args,确定并使用适当的子解析器来解析其余的参数,但很难从帮助消息中为用户提供转换器及其参数的列表。
有没有办法做到这一点?
发布于 2016-12-13 00:35:00
推断要使用的子解析器是很棘手的,因为它需要在检查以下每个参数时重新实现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)发布于 2017-11-03 01:06:29
在我看来,这给了你更多的控制权。它正朝着你所要求的方向发展。只需根据需要添加文件扩展名检查即可。
#prog.py
topParser=argparse.ArgumentParser()
subParsers = topParser.add_subparsers(
title='SubCommands',
description='Use "prog.py <subCommand> (-h | --help)" to learn more about each subcommand',
help='I can do stuff')
subParser1 = subParsers.add_parser('use1', help="Use1 does one thing")
subParser2 = subParsers.add_parser('use2', help='Use2 does another thing')
subParser1.add_argument(
'-f','--first-arg-for-use1',
help="A text file",
required=True
)
subParser1.add_argument(
'-s','--second-arg-for-use1',
help="An encoding",
required=True
)
subParser2.add_argument(
'-f','--first-arg-for-use2',
help="An image format",
required=True
)
args = topParser.parse_args()
print(args)即使没有其他内容,它也展示了如何处理不同层的帮助文本。
https://stackoverflow.com/questions/41105192
复制相似问题