Argparse:可选参数,对于不同的位置参数是不同的

时间:2015-04-10 12:57:23

标签: python command-line-arguments argparse

我想要一个带有可选参数的位置参数。像my_command foo --version=0.1 baz bar --version=0.2一样的Smth。这应该解析为[foo, bar, baz]列表,其中version设置为其中2个。

如果没有可选参数,设置nargs=*nargs=+是微不足道的,但是我很难为位置问题提供可选参数。是否可以使用argparse?

1 个答案:

答案 0 :(得分:1)

Multiple invocation of the same subcommand in a single command line

这会尝试解析类似

的内容
$ python test.py executeBuild --name foobar1 executeBuild --name foobar2 ....

两个提议的解决方案都多次调用解析器。每个调用都处理cmd --name value对。一个用手分割sys.argv,另一个用argparse.REMAINDER参数收集未解析的字符串。

通常,期权可以按任何顺序发生。它们仅由-标志值标识。定位必须按特定顺序发生,但是可选项可以在不同位置之间发生。另请注意,在使用情况显示中,首先列出选项,然后是位置。

 usage: PROG [-h] [--version Version] [--other OTHER] FOO BAR BAZ

subparsers是将位置参数与一个或多个optionals相关联的唯一方法。但通常允许解析器只有一个subparsers参数。

如果没有子分析符,append是从重复使用可选项中收集数据的唯一方法:

parser.add_argument('--version',action='append')
parser.add_argument('foo')
parser.add_argument('bar')
parser.add_argument('baz')

将处理您的输入字符串,生成如下命名空间:

namespace(version=['0.1','0.2'],foo='foo',bar='bar',baz='baz')

但是,没有办法将baz标识为缺少的import argparse usage = 'PROG [cmd [--version VERSION]]*' parser = argparse.ArgumentParser(usage=usage) parser.add_argument('cmd') parser.add_argument('-v','--version') parser.add_argument('rest', nargs=argparse.PARSER) parser.print_usage() myargv = 'foo --version=0.1 baz bar --version=0.2'.split() # myargv = sys.argv[1:] # in production myargv += ['quit'] # end loop flag args = argparse.Namespace(rest=myargv) collect = argparse.Namespace(cmd=[]) while True: args = parser.parse_args(args.rest) collect.cmd += [(args.cmd, args.version)] print(args) if args.rest[0]=='quit': break print collect '版本值。

关于组 - 参数组只会影响帮助显示。它们与解析无关。

您如何向您的用户(或从现在起6个月后)解释如何使用此界面?用法和帮助会是什么样的?将设计更改为更容易实现和解释的内容可能更简单。


这是一个处理您的样本输入的脚本。

argparse.PARSER

它反复解析位置和可选,在+参数中收集其余部分。这与quit类似,因为它至少需要一个字符串,但它也会收集看起来像选项的字符串。我需要添加一个PARSER字符串,以便在没有任何内容填充此usage: PROG [cmd [--version VERSION]]* Namespace(cmd='foo', rest=['baz', 'bar', '--version=0.2', 'quit'], version='0.1') Namespace(cmd='baz', rest=['bar', '--version=0.2', 'quit'], version=None) Namespace(cmd='bar', rest=['quit'], version='0.2') Namespace(cmd=[('foo', '0.1'), ('baz', None), ('bar', '0.2')]) 参数时不会抛出错误。

制造

nargs

处理子分析符的位置参数也使用此cmd值。这就是它如何识别和收集{{1}}字符串以及其他所有内容。

因此可以解析您想要的参数字符串。但我不确定代码的复杂性是否值得。代码可能也很脆弱,适合这一特定的参数集,并且只是一些变体。