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