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

How to make argparse take other parameters as arguments?

我正在编写一个包装器脚本,它将一些参数传递给另一个应用程序。调用 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 而不是提供它--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 之后发生的所有事情?

感谢评论,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)

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