Argparse 仅匹配第一个选项条目
Argparse to match the first option entry only
我在其中一个特殊情况下使用 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
值。
您可以设置位置参数以获取命令行的剩余:
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')
argparse.REMAINDER
. All the remaining command-line arguments are gathered into a list. This is commonly useful for command line utilities that dispatch to other command line utilities:
你不可能真的做你真正想做的事;樱桃以任意顺序挑选任意参数。您可以在 command
部分之前捕获特定参数并在之后捕获任意参数,但是在 command
部分之前支持任意参数也是行不通的,因为您无法知道哪些可选参数采用参数,哪些不采用参数。 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
值。
您可以设置位置参数以获取命令行的剩余:
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')
argparse.REMAINDER
. All the remaining command-line arguments are gathered into a list. This is commonly useful for command line utilities that dispatch to other command line utilities:
你不可能真的做你真正想做的事;樱桃以任意顺序挑选任意参数。您可以在 command
部分之前捕获特定参数并在之后捕获任意参数,但是在 command
部分之前支持任意参数也是行不通的,因为您无法知道哪些可选参数采用参数,哪些不采用参数。 argparse
这里帮不了你。