我想将脚本从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
处理以-
开头的参数值?