可选的subparsers?

时间:2017-04-03 19:37:00

标签: python-2.7 python-3.x argparse

我有一个utility,允许用户阅读他们的~/.aws/credentials文件并导出环境变量。

目前,CLI界面如下所示:

usage: aws-env [-h] [-n] profile

Extract AWS credentials for a given profile as environment variables.

positional arguments:
  profile          The profile in ~/.aws/credentials to extract credentials
                   for.

optional arguments:
  -h, --help       show this help message and exit
  -n, --no-export  Do not use export on the variables.

我想在这里做的是提供一个ls子分析器,允许用户在~/.aws/credentials中列出有效的个人资料名称。

界面将是这样的:

$ aws-env ls
profile-1
profile-2

...等等。有没有办法可以在argparse中原生地执行此操作,以便在-h输出中显示一个选项,表明ls是一个有效的命令?

1 个答案:

答案 0 :(得分:1)

如果你走subparsers路线,你可以定义两个解析器,' ls'并且'提取'。 ' LS'不会有任何争论; '提取'将采取一个位置,'配置文件'。

subparsers是可选的,(Argparse with required subparser),但是当前定义的' profile'是必需的。

另一种方法是定义两个选项,并省略位置。

'-ls', True/False, if True to the list
'-e profile', if not None, do the extract.

或者您可以保留位置profile,但可以选择它(nargs ='?')。

另一种可能性是在解析后查看profile值。如果它是类似' ls'的字符串,则列出而不是提取。这感觉就像最干净的选择,然而,用法不会记录这一点。

parser.add_argument('-l','--ls', action='store_true', help='list')
parser.add_argument('profile', nargs='?', help='The profile')

sp = parser.add_subparsers(dest='cmd')
sp.add_parser('ls')
sp1 = sp.add_parser('extract')
sp1.add_argument('profile', help='The profile')

必需的互斥小组

gp = parser.add_mutually_exclusive_group(required=True)
gp.add_argument('--ls', action='store_true', help='list')
gp.add_argument('profile', nargs='?', default='adefault', help='The profile')

产生

usage: aws-env [-h] [-n] (--ls | profile)