繁体   English   中英

Argparse:如何接受任意数量的可选参数(以`-`或`--`开头)

[英]Argparse: How to accept any number of optional arguments (starting with `-` or `--`)

我正在尝试创建一个命令行工具(让我们称之为'X')包装另一个工具(让我们称之为'Y')。

我特意处理了一些案例,并添加了一些我自己的选项,但我想将我不想处理的任何内容重定向到工具Y.

到目前为止,我设法重定向没有破折号的参数,例如XY 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的doc,你可以使用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')

我发现了这个解决方法:

而不是简单地使用main_parser.parse_args()我这样做

def remove_dashes_from_args(args):
    return [arg.replace('-','#$%#$') for arg in args]

main_parser.parse_args(replace_dashes_from_args(sys.argv[1:]))

然后在调用Y命令时我不必更改任何内容,因为我已经在使用sys.argv:

if arg.parser_name == 'y':
    os.system(' '.join(['y'] + sys.argv[2:]))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM