Argparse仅匹配第一个选项条目

时间:2015-08-28 12:38:50

标签: python argparse

在其中一个角落案例中使用argparse时遇到问题。说,我有一个脚本以下列方式运行另一个应用程序:

./myScript -a 1 -b 2 -c 3 <etc> ./application.exe <application arguments>

我不知道也不关心应用程序的参数,但问题是它们可能与脚本的参数冲突,例如: “-abc 123”或甚至“-a bla_bla”。 我想要的是使argparse与命令行中的第一个匹配选项匹配,并且不尝试匹配字符串的其余部分。有可能吗?

例如:

parser = argparse.ArgumentParser() 
parser.add_argument('-a', '--aaa', default=1, dest='first_entry') 
args, unknown = parser.parse_known_args() 
print args 

./example.py -a 3 someApplication -ab 4生成以下输出:

Namespace(first_entry='b') 

虽然我希望它是

Namespace(first_entry='3') 

在我的确切情况下,启动字符串看起来如下

`./script -a 1 -b1 2 -b2 2 -b3 2 ... -bX 2 -c 3 ./application.exe -ab 3`

其中-a, -b1, .., -bX, -c可以按任何顺序放置 我不能将所有可能的参数添加到我的脚本中,因为基本上我只想检查-a和-c并将其他所有内容传递给另一个脚本(具有大量支持的选项)。 当我使用REMAINDER时,它会将-a选项后的所有内容放入rest,而我也希望获得-c值。

1 个答案:

答案 0 :(得分:4)

您可以设置位置参数以获取命令行的余数

parser.add_argument('command', nargs=argparse.REMAINDER)

一旦解析了位置参数,这会告诉argparse将所有参数吞并到命名空间的command变量中:

>>> import argparse
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('-a', '--aaa', default=1, dest='first_entry') 
_StoreAction(option_strings=['-a', '--aaa'], dest='first_entry', nargs=None, const=None, default=1, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('command', nargs=argparse.REMAINDER)
_StoreAction(option_strings=[], dest='command', nargs='...', const=None, default=None, type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args(['-a', '3', 'someApplication', '-ab', '4'])
Namespace(command=['someApplication', '-ab', '4'], first_entry='3')

来自nargs documentation

  

argparse.REMAINDER。所有剩余的命令行参数都收集到一个列表中。这对于调度到其他命令行实用程序的命令行实用程序通常很有用:

你真的不能做你真正想要的事情; cherry以任意顺序挑出任意参数。您可以在command部分和之后的任意参数之前捕获特定参数,但在command部分之前支持任意参数也是不可行的,因为您无法知道哪些可选参数采用参数以及哪些参数不具备参数。 argparse在这里无法帮助你。