1

定义子解析器的通常方法是

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

and会从andargparse中确定 subparser并调用 subparser来解析. 当然,这里是特定于子解析器的。ext1_to_ext2file.ext1file.ext2ext1_to_ext2EXTRAEXTRA

我尝试为每个转换器使用add_argument_group参数组(

我尝试使用parse_known_args两个位置参数,确定并使用适当的子解析器来解析剩余的参数,但是很难从帮助消息中为用户提供转换器列表及其参数。

有没有办法做到这一点?

4

2 回答 2

1

推断要使用的子解析器很棘手,因为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)
于 2016-12-12T16:34:59.517 回答
0

在我看来,这让你有更多的控制权。它一直在朝着你的要求前进。只需根据您的需要添加文件扩展名检查。

#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)

如果没有别的,它显示了如何处理不同层的帮助文本。

于 2017-11-02T17:06:29.293 回答