2017-04-04 7 views
0

unittestをサブコマンドの1つとして実行できるargパーサを実装したいと思います。引数を盲目的に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 

I できprint(p.parse_args('unittest -- -f -g'.split()))を行うが、敗北の--種類argparse.REMAINDERの目的を必要とします。

​​に私がしたいことをする方法はありますか?それとも、このケースを手書きする必要がありますか? 4年前から

のPython 2.7.5

+0

ここで間違った木を吠えていると思います。テストコードをライブラリコードから完全に除外してください。 – wim

+0

それは、他の誰かがそれを変更した場合に、簡単にテストできることを確認するために必要なスタンドアロンのスクリプトです。外部のテストハーネスはそれを達成しません... – rrauenza

答えて

1

http://bugs.python.org/issue17050で説明したのと同じ問題のように見える、argparse.REMAINDER doesn't work as first argument

私の控除がまだ保持している - -blahREMAINDERはチャンスがあっても前に、オプションのフラグとして分類されています行動する。 ' - 'は先に解析されますが、...は、ある意味では '*'の一般化です。そして広く使われているものではありません。 'subparsers' Actionの価値はnargs='+...'argparse.PARSER)です。少なくとも1つの文字列である 'cmd'を除いて、REMAINDERと似ています。

http://bugs.python.org/issue9334の可能な修正は行われていません。だからあなたは '-blah'を単独で扱うか、 ' - 'を使う必要があります。 parse_known_argsもあなたのケースで動作する可能性があります。

関連する問題