我正在尝试创建包装另一个工具(称为“Y”)的命令行工具(简称为“X”)。
我专门处理一些情况,并添加一些我自己的选项,但是我想将我不想处理的所有内容重定向到工具Y。
到目前为止,我设法重定向了不带破折号的参数,例如X Y option1 option2 option3
将只调用Y option1 option2 option3
。我通过向其添加子解析器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='*')
然后在我的处理程序代码中,我这样做:
args = main_parser.parse_args()
if args.parser_name == 'y':
command_string = ' '.join(['y'] + sys.argv[2:])
os.system(command_string)
当我调用
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行)。但是在深入研究之前,我想也许有人知道该怎么做-如果没有,如果有人遇到同样的问题,我会在这里发表我的发现。 最佳答案
从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')
即使子命令参数中的破折号也可以使用
>>> 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')
关于python - Argparse:如何接受任意数量的可选参数(以 `-`或 `--`开头),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31424769/