使用带有以短划线(“ - ”)开头的参数值的argparse

时间:2017-08-07 07:34:17

标签: python argparse

我想做什么

我想将脚本从docopt迁移到argparse。我的脚本为输入文件采用位置参数,然后调用另一个命令行工具。它还采用一个可选的参数选项,允许用户指定将传递给该命令行工具的其他参数和选项。

所以,我允许用户打电话:

my_program.py INPUT --extra-options "-foo bar -baz"

然后将这些--extra-options添加到我在脚本中调用的其他程序中,例如:

other_program -foo bar -baz INPUT

问题

现在,将参数解析迁移到argparse后,这不再起作用了:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("input", nargs="+")
parser.add_argument("-e", "--extra-options", type=str)
parser.add_argument("-f", "--force", default=False, action="store_true")
args = parser.parse_args()

当我拨打同一个命令时,它会说:

error: argument -e/--extra-options: expected one argument

但是-e被赋予了一个参数(-foo bar -baz,确切地说)!我的期望是shell会根据双引号对参数进行分组,而argparse会理解这一点。

现在,在手册中,我们发现:

  

位置参数可能只是以 - 如果它们看起来像负数并且解析器中没有看起来像负数的选项...如果你的位置参数必须以 - 并且看起来不像负数,那么可以插入伪参数' - ',它告诉parse_args()之后的所有内容都是位置参数

但这不适用于此 - 我希望-e只是解析shell中的下一个单词作为其参数。在这种情况下的问题是另一个选项-f/--force - 一旦我删除它,或给它一些其他名称(例如,-x),参数就会被正确解析。显然,f -foo-f/--force选项发生冲突。

我尝试了什么

我查看了this question的答案,但没有一个能解决问题。

  • 我无法强制用户以不同方式指定此选项(例如,以空格开头,使用=,以空格结尾,...),因为它会破坏与现有脚本的向后兼容性。
  • 我不想使用已弃用的模块(optparse)。
  • parse_known_args解决方案在这种情况下不起作用。
  • nargs=argparse.PARSER解决方案也不起作用。
  • 删除nargs也无济于事。

在这种情况下,如何让argparse处理以-开头的参数值?

0 个答案:

没有答案