argparse选项选项

时间:2016-03-15 16:02:54

标签: python python-3.x argparse

我正在尝试在argparse中添加选项选项。 目前我有:

group = parser.add_mutually_exclusive_group()
group.add_argument("--md", help="Create xyz file for each ionic step for"
                    " visualization", action='store_true')
group.add_argument("--force", help="See which atom has maximum force",
                    action='store_true')
group.add_argument("--opt", help="grep string from file",
                    nargs=2, metavar=("str", "file"))
parser.add_argument("--xsf", help="Create xsf file for md(default is xyz)"
                    " visualization", action='store_true')
parser.add_argument("-N", help="Showing first N line",
                    metavar='integer', type=int)
parser.add_argument("-n", help="Showing last n line",
                    metavar='integer', type=int)
args = parser.parse_args()

给出:

./foo.py --h
usage: foo.py [-h]
               [--md | --force | --opt str file]
               [--xsf] [-N integer] [-n integer]

但我希望--xsf作为--md的子选项,-N,-n作为--opt; e.g。

./foo.py --h
    usage: foo.py [-h]
                   [--md [--xsf]| --force | --opt str file [-N integer] [-n integer]]

但我不知道如何实现这一目标。可能是我遗漏了一些东西,但argparse doc

中没有这样的选项

还有其他办法吗?

1 个答案:

答案 0 :(得分:2)

mutually_exclusive_group机制非常简单,不适用于任何类型的嵌套或子分组。

有一个Python错误/问题要求更全面的分组机制,但提议的补丁相当复杂。问题不在于测试,而是以用户友好的方式定义组,并生成usage行。包含所需用法很不错,但这种格式远远超出了当前帮助格式化程序的功能。

你可能会把你的问题重新塑造为一个子问题。 subparsers是互斥的(你只能给一个命令名),你可以指定--xsf作为md的参数,-N作为--opt的参数。但是,subparsers有自己的帮助问题。

另一种方法是编写自己的usage,并在解析后自行测试参数。通过适当选择默认值,您通常可以判断是否已提供参数(用户无法指定None),或者您可以忽略不必要的参数。