【问题标题】:Argparse to match the first option entry onlyargparse 仅匹配第一个选项条目
【发布时间】:2015-11-23 03:06:37
【问题描述】:

在其中一种极端情况下使用 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 值。

【问题讨论】:

  • 你能改变-a,使它不与其他参数冲突吗? --a 甚至可以工作,更好的是 --anything-but-ab-- 选项的处理方式与 - 不同。

标签: python argparse


【解决方案1】:

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

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。所有剩余的命令行参数都被收集到一个列表中。这对于调度到其他命令行实用程序的命令行实用程序通常很有用:

你不能真正做你真正想做的事;樱桃以任意顺序挑选任意参数。您可以在 command 部分之前捕获特定参数并在之后捕获任意参数,但是在 command 部分之前支持任意参数也是不可行的,因为您不知道哪些可选参数带参数,哪些不带参数。 argparse 在这里帮不了你。

【讨论】:

  • 感谢您的建议,但我无法更改命令行的格式。不允许使用“--”。
  • 可能,至少有一种方法可以让 argparse 进行精确匹配,这样 --foo 就不会与 --food 匹配?
  • Argparse 永远不会将 --food 与名为 --foo 的配置选项匹配。我不确定你在这里问什么;您是否也需要验证argparse.REMAINDER 选项捕获的选项?
  • @YuliaSh.: 看起来它可以在 Python 3.5 中实现,它有一个新的allow_abbrev 开关(默认设置为True)。见bugs.python.org/issue14910
  • @YuliaSh.:据我所知,您想要的(仅定义一些可在 command 部分之前使用的可选参数)无法使用 argparse 完成。没有办法正确解析这些参数,并且仍然知道与 --- 可选参数一起使用的参数是什么,以及其他什么。
猜你喜欢
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 2014-10-24
  • 2021-04-11
  • 2021-02-28
  • 1970-01-01
相关资源
最近更新 更多