我正在尝试创建一个命令行工具(让我们称之为'X')包装另一个工具(让我们称之为'Y').
我特意处理了一些案例,并添加了一些我自己的选项,但我想将我不想处理的任何内容重定向到工具Y.
到目前为止,我设法重定向没有破折号的参数,例如X Y option1 option2 option3只会调用Y option1 option2 option3.我通过添加一个subparser Y和一个参数any来做到这一点
这是代码(x.py):
main_parser = argparse.ArgumentParser()
subparsers = main_parser.add_subparsers(dest="parser_name")
y_subparser = subparsers.add_parser('y')
y_options = y_subparser.add_argument('any', nargs='*')
Run Code Online (Sandbox Code Playgroud)
然后在我的处理程序代码中,我这样做:
args = main_parser.parse_args()
if args.parser_name == 'y':
command_string = ' '.join(['y'] + sys.argv[2:])
os.system(command_string)
Run Code Online (Sandbox Code Playgroud)
当我打电话给python x.py y asdf zxcv qwer它工作.
当我打电话时,python x.py y asdf zxcv qwer -option我得到了错误x.py: error: unrecognized arguments: -option
我意识到如果东西变得太复杂了,argparse我可以总是回到使用sys.argv,但如果你知道这是可行的,请分享.
我也一直在查看argparse代码,它有点密集,似乎可以ArgumentParser._parse_known_args做任何事情(300行).但在我深入研究之前,我想也许有人知道如何做到这一点 - 如果没有,我会在这里发布我的发现,如果其他人有同样的问题.
小智 7
从argparse的文档中,您可以使用argparse.REMAINDER:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo')
>>> parser.add_argument('command')
>>> parser.add_argument('args', nargs=argparse.REMAINDER)
>>> print(parser.parse_args('--foo B cmd --arg1 XX ZZ'.split()))
Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B')
Run Code Online (Sandbox Code Playgroud)
这项工作甚至在子命令参数中使用了虚线
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo')
>>> parser.add_argument('command')
>>> parser.add_argument('args', nargs=argparse.REMAINDER)
>>> print(parser.parse_args('--foo B cmd --arg1 XX ZZ --foobar'.split()))
Namespace(args=['--arg1', 'XX', 'ZZ', '--foobar'], command='cmd', foo='B')
Run Code Online (Sandbox Code Playgroud)