2017-04-04 117 views
0

我想实现一个arg解析器,它允许我将unittests作为子命令之一运行,将参数盲目地传递给unittest.main()。例如,在解析器/子语法分析器开始时使用argparse.REMAINDER

$ 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()))  

输出:

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()))    

输出:

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

可以print(p.parse_args('unittest -- -f -g'.split())),但要求--那种失败的argparse.REMAINDER的目的。

有没有办法让​​做我想做的事?或者我只是需要手解析这种情况?

的Python 2.7.5

+0

我想你在这里吠叫错了树。完全保留测试代码不在库代码中。 – wim

+0

这是一个独立的脚本,我需要确保可以轻松测试以防其他人修改它。外部测试工具无法完成... – rrauenza

回答

1

貌似http://bugs.python.org/issue17050讨论同一个问题,argparse.REMAINDER doesn't work as first argument

从4岁我扣前仍持有 - 在-blah被归类为一个可选的标志,甚至REMAINDER之前有机会行动。 ' - '被解析得更早,但是...在某种意义上只是'*'的泛化。而不是一个广泛使用的。对于'subparsers'的值是什么值有一个nargs='+...'值(argparse.PARSER) - 它就像REMAINDER,但它至少需要一个字符串'cmd'。

http://bugs.python.org/issue9334中的可能修复尚未执行。所以你要么需要自己处理'-blah',要么使用' - '。 parse_known_args也可能适用于您的情况。