【发布时间】:2018-04-22 15:52:21
【问题描述】:
我们正在尝试在我们正在使用的命令行工具上构建一个包装脚本。我们想根据包装脚本中的选项设置一些工具参数。我们还希望能够将本地参数直接传递给命令行工具,因为它们是写在命令行上的。
这是我们想出的:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('positional')
parser.add_argument('-f', '--foo', action='store_true')
parser.add_argument('-b', '--bar', action='store_true')
parser.add_argument('native_arg', nargs='*')
args = parser.parse_args()
print (args)
positional 是必填项。基于选项-f 和-b,我们将在我们的工具调用中添加一些额外的选项。之后留下的任何东西(如果有的话)都应该被视为本机工具参数并直接提供给工具。使用-h 调用我们的脚本会产生以下用法:
usage: test.py [-h] [-f] [-b] positional [native_arg [native_arg ...]]
诀窍在于,这些本机参数本身就是工具的选项,并且包含前导破折号,例如 -native0 和 -native1。我们已经知道使用双破折号阻止 argparse 寻找更多选项的技巧。以下调用:
./test.py pos -- -native0 -native1
产生预期的解析参数:
Namespace(bar=False, foo=False, native_arg=['-native0', '-native1'], positional='pos')
但是,尝试在第一个位置参数之后添加选项不起作用。更具体地说,以下调用:
./test.py pos --foo -- -native0 -native1
产生以下输出:
usage: [...shortened...]
test.py: error: unrecognized arguments: -- -native0 -native1
将可选参数放在位置之前:
./test.py --foo pos -- -native0 -native1
似乎可以工作,因为打印了以下内容:
Namespace(bar=False, foo=True, native_arg=['-native0', '-native1'], positional='pos')
更奇怪的是,将 native_arg 的 nargs 的值更改为 '+' 在上述所有情况下都有效(当然需要注意的是,至少需要一个 native_arg)。
我们是在 Python 代码中做错了什么还是这是某种 argparse 错误?
【问题讨论】: