如何让argparse将其他参数作为参数?

时间:2018-06-13 08:04:41

标签: python argparse

我正在编写一个包装脚本,它将一些参数传递给另一个应用程序。调用wrapper.py --param1 x --param2 y --args -i 1 -name "Mike Wazowski" --verbose最终应该启动最终执行的subprocess.Popen

app.exe -i 1 -n "Mike Wazowski" --verbose

但是,这不起作用,因为我的wrapper.py脚本中的argparse认为-i-n--verbose是它应该解析的参数。

我可以封装我只想在引号中传递的参数,但是我还必须在引号内转义任何引号。但是,我希望真的避免这种情况:

`wrapper.py --param1 x --param2 y --args "-i 1 -name \"Mike Wazowski\" --verbose"`

我已经尝试了什么

我正在从文档中获取this example

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='*')
>>> parser.add_argument('--bar', nargs='*')
>>> parser.add_argument('baz', nargs='*')
>>> parser.parse_args('a b --foo x y --bar 1 2'.split())
Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])

但不是给它--bar 1 2我需要能够提供例如{1}}。 --bar -i -n "Mike Wazowski" --verbose。但是,这会导致错误:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='*')
>>> parser.parse_args('--foo -s 1 -e 2'.split())
usage: [-h] [--foo [FOO [FOO ...]]]
: error: unrecognized arguments: -i -n "Mike Wazowski" --verbose

我能做些什么来完成这项工作? 我总是不得不将--args参数定义为最后一个参数。我应该将--args视为虚拟参数,然后手动解析sys.argv以获取我需要的内容吗?如果是这样,怎么能告诉argparse忽略我的包装器命令中--args出现后发生的一切?

1 个答案:

答案 0 :(得分:0)

感谢评论,hpaulj!我认为nargs=argparse.REMAINDER是我最好的选择,因为它将目标应用程序的参数与我的包装器参数分开。这样我就不必担心包装器的参数会与我只想传递的参数冲突。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--verbose', action='store_true')
parser.add_argument('rest_args', nargs=argparse.REMAINDER)

args = parser.parse_args()
print(args)

因此,在致电wrapper.py -- -i 1 -name "Mike Wazowski" --verbose时,我得到了:

Namespace(rest_args=['-i', '1', '-name', 'Mike Wazowski', '--verbose'], verbose=False)

如果我打电话给wrapper.py --verbose -- -i 1 -name "Mike Wazowski" --verbose

Namespace(rest_args=['-i', '1', '-name', 'Mike Wazowski', '--verbose'], verbose=True)

注意,--在上面的示例中实际上是可选的,并且会产生相同的结果。