2017-04-04 75 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也可能適用於您的情況。