Python 其他参数隐含的argparse子parser
通常定义子Parser的方法是Python 其他参数隐含的argparse子parser,python,argparse,subparsers,Python,Argparse,Subparsers,通常定义子Parser的方法是 master_parser = argparse.ArgumentParser() subparsers = master_parser.add_subparsers() parser = subparsers.add_parser('sub') parser.add_argument('--subopt') 而副检察官会被打电话 command sub --subopt 我正在实现一个调用多个转换器的包。如果我使用通常的次帕斯方法,我将不得不这样做 conv
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
确定子parserext1\u到ext2
,并调用子parserext1\u到ext2
来解析EXTRA
。当然,EXTRA
这里是子parser-specific
我尝试为每个转换器使用参数组(add_argument_group
),但参数组中的参数不能重叠,并且我从所有解析器获得了一个混乱的组合参数列表,因此使用子参数似乎是一种可行的方法
我尝试使用带有两个位置参数的parse_known_args
,确定并使用适当的子parser来解析其余的args,但很难从帮助消息中为用户提供转换器及其参数的列表
有什么方法可以做到这一点吗?推断要使用的子parser很棘手,因为在检查以下每个参数时,需要重新实现
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)
在我看来,这给了你更多的控制权。它正朝着你的要求前进。只需根据需要添加文件扩展名检查
#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)
#prog.py
topParser=argparse.ArgumentParser()
subParsers=topParser.add_subParsers(
title='SubCommands',
description='Use“prog.py(-h |--help)”了解有关每个子命令的更多信息',
帮助(我能做些事情)
subParser1=subParsers.add_解析器('use1',help=“use1做一件事”)
subParser2=subParsers.add_解析器('use2',help='use2做另一件事')
subParser1.add_参数(
'-f','-first-arg-for-use1',
help=“文本文件”,
必需=真
)
subParser1.add_参数(
'-s','-second-arg-for-use1',
help=“一种编码”,
必需=真
)
subParser2.add_参数(
'-f','-first-arg-for-use2',
help=“图像格式”,
必需=真
)
args=topParser.parse_args()
打印(args)
如果没有其他内容,它将显示如何处理不同层的帮助文本。是否可以使用?这将允许您解析参数的第一部分,自己评估适当的子parser,然后将剩余的参数传递给适当的子parser。这是我现在正在采取的方法,但我正在努力为用户提供帮助消息。似乎我需要劫持
convert file.ext1 file.ext2-h
来打印来自另一个解析器的帮助消息,但我仍然无法列出convert-h
中所有可用的转换器(也许一个epilog
可以工作)。您要求的逻辑对于argparse
来说是不合理的。直接解析sys.argv
,或者通过argparse
以简单字符串的形式获取值,然后推断应该采取的操作。但是命令行仍然是convert sub file.jpg file.tiff
。我刚刚有了一个很棒的(?)主意,劫持sys.argv怎么样?我可以检查sys.argv[1]
和sys.argv[2]
,在sys.argv[1]
之前插入适当的子parser名称,并使用所有子parser调用主解析器。不过,-h
消息可能有点不对劲。虽然前两个位置参数不一定是sys.argv[1]
和sys.argv[2]
,但这种方法没有明显的问题。