Python 2.7 可选择的次parser?

Python 2.7 可选择的次parser?,python-2.7,python-3.x,argparse,Python 2.7,Python 3.x,Argparse,我有一个允许用户读取其~/.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 crede

我有一个允许用户读取其
~/.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.
$ aws-env ls
profile-1
profile-2
我想在这里做的是提供一个
ls
子parser,允许用户在
~/.aws/credentials
中列出有效的配置文件名

界面应该是这样的:

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.
$ aws-env ls
profile-1
profile-2

…等等。是否有一种方法可以在argparse中本机执行此操作,以便在我的
-h
输出中显示一个选项,该选项显示
ls
是一个有效的命令?

如果您选择
子parser
路径,您可以定义两个解析器,“ls”和“extract”ls'不会有任何争论;'“提取”将采用一个位置“配置文件”

子parser是可选的,(),但当前定义的“profile”是必需的

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

'-ls', True/False, if True to the list
'-e profile', if not None, do the extract.
或者您可以保留位置
配置文件,但将其设置为可选(nargs='?')

另一种可能是在解析后查看
概要文件
值。如果它是一个类似“ls”的字符串,则使用list而不是extract。这感觉像是最干净的选择,但是,用法不会记录这一点


必需的相互排斥的组

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)

如果使用
子解析器
路径,可以定义两个解析器“ls”和“extract”ls'不会有任何争论;'“提取”将采用一个位置“配置文件”

子parser是可选的,(),但当前定义的“profile”是必需的

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

'-ls', True/False, if True to the list
'-e profile', if not None, do the extract.
或者您可以保留位置
配置文件,但将其设置为可选(nargs='?')

另一种可能是在解析后查看
概要文件
值。如果它是一个类似“ls”的字符串,则使用list而不是extract。这感觉像是最干净的选择,但是,用法不会记录这一点


必需的相互排斥的组

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)

你真的试过添加一个次parser吗?我需要一个用于
ls
命令的子parser,以及一个用于匹配单个概要文件名称(可以是任何内容)的通用子parser。这可能吗?我不确定我正在执行的是
ls
子命令,其结果是输出
profile-1\n profile-2
,还是希望
profile-X
成为arg解析器的一部分?如果是后者,假设您没有为凭证文件提供选项,只需读取它并提取概要文件,然后将它们添加到解析器中。@jonsharpe-您的SO链接基本上说,在混合位置参数和子parser时要小心。根据我的经验,当主解析器的所有参数都被标记(可选)时,子解析器工作得最好。您是否确实尝试过添加子解析器?我需要一个用于
ls
命令的子parser,以及一个用于匹配单个概要文件名称(可以是任何内容)的通用子parser。这可能吗?我不确定我正在执行的是
ls
子命令,其结果是输出
profile-1\n profile-2
,还是希望
profile-X
成为arg解析器的一部分?如果是后者,假设您没有为凭证文件提供选项,只需读取它并提取概要文件,然后将它们添加到解析器中。@jonsharpe-您的SO链接基本上说,在混合位置参数和子parser时要小心。根据我的经验,当主解析器的所有参数都被标记(optionals)时,子解析器工作得最好;DR:这确实不可能,但有解决办法;博士,这真的不可能,但有解决办法。