Argparse:是否可以使帮助上下文敏感

时间:2012-11-13 09:17:16

标签: python argparse context-sensitive-help

我有一个使用argparse来处理命令行的程序。 程序的命令行及其帮助变得对上下文敏感。 我想帮助反映上下文的敏感性。

e.g。

prog --mode=1 OPTA OPTB OPTC<br>
prog --mode=2 OPTD OPTE OPTF<br>

prog --mode=1 -h<br>
"In mode 1 you have four options, A,B,C,D"

prog --mode=2 -h<br>
"You mode 2 you have four options, D,E,F,G"

我应该在此添加,这只是一个例子。在我的实际程序中,可能有任意数量的模式,它们不是由我的代码定义的,它们是由我的API用户定义的。因此,不可能为每种模式硬编码帮助。实际的帮助文本稍后定义。

这意味着更改参数&#39;选项&#39;的帮助字符串。在处理了--mode参数后反映不同的模式。下面的代码基本上起作用,命令按预期工作,但帮助没有。

问题是parse_known_args()似乎处理-h然后退出。我需要parse_args()来处理帮助。显然我可以简单地解析sys.argv并自己找--mode,但肯定会击败argparse的对象。

import argparse

parser = argparse.ArgumentParser(description='Test argparser')
parser.add_argument('--mode', nargs=1, type=int,
                    default=[1],
                   help='program mode')

options={
    1:["OPTA","OPTB","OPTC","OPTD"],
    2:["OPTD","OPTE","OPTF","OPTG"]}


args = parser.parse_known_args()[0]

print "Initial pass"
print args

parser.add_argument('options', type=str, nargs='+',
                    choices=options[args.mode[0]]+["ALL"],
                    default="ALL",
                   help='One or more of the options, above')

args = parser.parse_args()

print "Second pass"
print args

1 个答案:

答案 0 :(得分:3)

你想要做的是由argparse的sub-commands处理。使用子命令意味着用子命令替换--mode选项:

prog --mode=1 OPTA OPTB OPTC

会变成

prog mode1 OPTA OPTB OPTC

mode1子命令可以得到自己的帮助;可以通过

访问它
prog mode1 -h

这种方法的另一个优点是prog -h列出了可能的子命令(以及相关的描述)。