其他参数隐含的argparse subparser

时间:2016-12-12 16:24:59

标签: python argparse subparsers

定义subparser的常用方法是

master_parser = argparse.ArgumentParser()
subparsers = master_parser.add_subparsers()
parser = subparsers.add_parser('sub')
parser.add_argument('--subopt')

将使用

调用subparser
command 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_ext2file.ext1的子分析器file.ext2,并调用子分析器ext1_to_ext2来解析EXTRA。当然EXTRA这里是subparser特定的。

我尝试为每个转换器使用参数组(add_argument_group),但参数组中的参数不能重叠,我得到了来自所有解析器的组合参数的杂乱列表,因此使用subparser似乎是通往去。

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

有办法做到这一点吗?

2 个答案:

答案 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

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