Python 如何使argparse以其他参数作为参数?

Python 如何使argparse以其他参数作为参数?,python,argparse,Python,Argparse,我正在编写一个包装器脚本,它将一些参数传递给另一个应用程序。调用wrapper.py--param1 x--param2 y--args-i1--name“Mike Wazowski”--verbose最终应启动一个子进程.Popen,该子进程最终执行: app.exe -i 1 -n "Mike Wazowski" --verbose 但是,这不起作用,因为我的wrapper.py脚本中的argparse相信-i,-n和-verbose是它应该解析的参数 我可以把我只想用引号传递的论点封装起

我正在编写一个包装器脚本,它将一些参数传递给另一个应用程序。调用
wrapper.py--param1 x--param2 y--args-i1--name“Mike Wazowski”--verbose
最终应启动一个
子进程.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"`

我已经试过了 我从文档中获取:

>>> 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-I-n“Mike Wazowski”-verbose
,而不是给出
--bar-12
。但是,这将导致错误:

>>> 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忽略在我的wrapper命令中出现
--args
之后发生的所有事情呢?

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

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)
Namespace(rest_args=['-i', '1', '-name', 'Mike Wazowski', '--verbose'], verbose=True)
如果调用
wrapper.py--verbose--i 1-name“Mike Wazowski”-verbose
我得到:

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

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

您可以正确地引用它们:
--args“-i 1-name \“Mike Wazowski\”--verbose”
。你为什么要避免这种情况?这是正确的处理方法。我的问题是我需要按原样传递参数。它们一开始并不是这样转义的,我必须在引号内对引号进行递归转义。我想,如果只是按原样传递参数,而不是递归地改变参数,会更容易。我想,我想说的是。。。想象一下,有人已经像你那样引用并逃避了他们的争论。我需要接受这些,并把它们传下去。“原样”和“原样”在哪里?你只是把它们从某个东西复制粘贴到你的终端上吗?不是。参数是由程序生成的,由用户执行。这些参数也可以由不知道需要引用或转义的用户手工编写。我认为有两种方法可以解决这个问题;一种是解析给定的参数并在需要的地方添加转义,另一种是只传递“原样”的参数。因为我也在处理面向用户的应用程序中转义字符的显示问题,所以我选择只传递参数。