我正在编写一个包装脚本,它将一些参数传递给另一个应用程序。调用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
出现后发生的一切?
答案 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)
注意,--
在上面的示例中实际上是可选的,并且会产生相同的结果。