python - argparse 其他参数隐含的子解析器

标签 python argparse subparsers

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

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.ext1file.ext2确定子解析器ext1_to_ext2并调用子解析器ext1_to_ext2 来解析 EXTRA。当然这里的EXTRA是特定于子解析器的。

我尝试为每个转换器使用参数组(add_argument_group),但是参数组中的参数不能重叠,并且我从所有解析器中得到了一个困惑的组合参数列表,因此使用子解析器似乎是要走的路。

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

有办法做到这一点吗?

最佳答案

推断要使用的子解析器很棘手,因为在检查以下每个参数时,它需要重新实现 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)

关于python - argparse 其他参数隐含的子解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41105192/

相关文章:

python - OpenCV安装目录只有一个.so文件?

python - 如何将键值管道分隔文件转换为带标题的完美 csv 文件

python - 在 Python 中合并两个 CSV 文件

python - 没有重复 ALLCAPS 的 argparse 帮助

python:使用文件句柄打印文件内容

python - 使用 argparse subparser 显示命令子组

python - 我可以向量化这个二维数组索引,其中第二维取决于第一维的值吗?

python - 在使用 Python 的 argparse 时知道用户是否指定了参数

Python argparse,根据父参数值提供不同的参数

python - Argparse:带有可变参数选项的可选参数