在解析器/子解析器的开头使用 argparse.REMAINDER

2024-05-12

我想实现一个 arg 解析器,它允许我将单元测试作为子命令之一运行,盲目地将参数传递给 unittest.main()。例如。,

$ foo.py unittest [args to pass to unittest.main()]

以及其他子命令:

$ foo.py foo ...
$ foo.py bar ...

按照 argparse 的示例,这是有效的:

#!/usr/bin/python                                                               
import argparse                                                                 

p = argparse.ArgumentParser(prog='PROG')                                        
p.add_argument('-v', '--verbose', action='store_true')                          
sub = p.add_subparsers(dest='cmd')                                              
foo = sub.add_parser('foo')                                                     
bar = sub.add_parser('bar')                                                     
unittest = sub.add_parser('unittest')                                           
unittest.add_argument('command') # Need to add this to make it work.                                              
unittest.add_argument('args', nargs=argparse.REMAINDER)                         

print(p.parse_args('unittest command -blah blah'.split()))       

Output:

Namespace(args=['-blah', 'blah'], cmd='unittest', command='command', verbose=False)

但这不是。似乎首先需要一个“正常”参数:

#!/usr/bin/python                                                               
import argparse                                                                 

p = argparse.ArgumentParser(prog='PROG')                                        
p.add_argument('-v', '--verbose', action='store_true')                          
sub = p.add_subparsers(dest='cmd')                                              
foo = sub.add_parser('foo')                                                     
bar = sub.add_parser('bar')                                                     
unittest = sub.add_parser('unittest')                                           
unittest.add_argument('args', nargs=argparse.REMAINDER)                         

print(p.parse_args('unittest -blah blah'.split()))             

Output:

$ /tmp/foo.py    
usage: PROG [-h] [-v] {foo,bar,unittest} ...
PROG: error: unrecognized arguments: -blah

I can do print(p.parse_args('unittest -- -f -g'.split())),但要求--有点违背了 argparse.REMAINDER 的目的。

有没有办法得到argparse做我想做的事?或者我只需要手动解析这个案例?

Python 2.7.5


看起来像中讨论的同一问题http://bugs.python.org/issue17050 http://bugs.python.org/issue17050, argparse.REMAINDER doesn't work as first argument

我 4 年前的推论仍然成立 --blah甚至之前就被归类为可选标志REMAINDER有机会行动。 '--' 已被解析较早,但是...从某种意义上来说,这只是“*”的概括。而且不是广泛使用的一种。对于“子解析器”操作的价值来说,它有一个nargs='+...' value (argparse.PARSER) - 它类似于 REMAINDER,只不过它需要至少一个字符串,即“cmd”。

可能的修复http://bugs.python.org/issue9334 http://bugs.python.org/issue9334尚未采取行动。因此,您要么需要单独处理“-blah”,要么使用“--”。parse_known_args可能也适用于你的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在解析器/子解析器的开头使用 argparse.REMAINDER 的相关文章

随机推荐