2017-05-03 7 views
1

argparseを使用して、任意の数のを受け取り、コマンドラインに位置指定引数のを設定します。例えば:Python argparse:引数の「複数の倍数」ですか?

myapp.py show 1 

showパラメータが「動作」であり、1は「オペランド」です。

私は操作や演算の複数セット受け入れることができるようにしたい:私は、任意の数のを許可するように最後の引数としてNnargsパラメータと引数を追加することができます知っている

myapp.py show 1 test 2 write 3 

をその議論の繰り返し。私は同じことをやりたいと思っていますが、1回の繰り返しにつき1つ以上の議論があります。この例では

:各操作は、オペランドに来なければならないので、

myapp.py show 1 test 

は、無効にする必要があります。

はまた、すべてのオペランドと仮定すると、整数であり、すべての演算子は文字列です:

myapp.py 1 show 2 test 

は失敗、またはオペレータが最初に来なければならないので、私は、故障の原因となりますので、少なくとも、コードの中で検出可能でなければなりません。

私も同じように、別のプロジェクトで引数の繰り返しセットあたりつ以上の「パラメータ」が必要になる場合があります:

myapp.py test 1 outputFile.dat write 2 writeFile.dat 

これを行うことができますか?

@mgilsonによって与えられたコメントで示唆に拡大
+0

あなたが持っ '--'をこれらのオペランドの前で感じだろうか? 'myapp。py --show 1 --test 2' – mgilson

+0

私はそれを行うことができましたが、2回目のオペレーションで2つのオペランドが必要な場合は動作しません。 – fdmillion

+0

[click](http://click.pocoo.org/5/arguments/#variadic-arguments)の使用はどうですか? –

答えて

0

が、ここでの操作は--が付いている一例ですが、これは動作しているようです:

>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('--foo', nargs=2) 
... 
>>> parser.add_argument('--bar', nargs=2) 
... 
>>> args = parser.parse_args(('--foo', '1', 'out.dat', '--bar', '2', 'out.dat')) 
>>> args 
Namespace(bar=['2', 'out.dat'], foo=['1', 'out.dat']) 

あなたは、その後に各サブ要素の追加の解析を行うことができます別のargparser:もちろん

>>> fooparser = argparse.ArgumentParser() 
>>> fooparser.add_argument('num', type=int) 
... 
>>> fooparser.add_argument('fname') 
... 
>>> fooparser.parse_args(args.foo) 
Namespace(fname='out.dat', num=1) 

、二argparserは手動で各2引数を自分で解析し、独自のエラーメッセージを生成することもできますので、あなたは、非常に奇妙なエラーメッセージを取得したい失敗した場合。

0
argv=sys.argv[1:] 
adict = {k:int(v) for k,v in zip(argv[::2], argv[1::2])} 

単語で - 辞書のコマンドラインから文字列のペアを収集します。これは、nargs='*'ポジションまたはextrasからparse_known_argsまでの未分化リストストリングでも機能します。エラーチェック/トラッピングは、読者の練習として残されています。


In [41]: argv='myapp.py show 1 test 2 write 3'.split() 
In [42]: argv=argv[1:] 
In [43]: adict = {k:int(v) for k,v in zip(argv[::2], argv[1::2])} 
In [44]: adict 
Out[44]: {'show': 1, 'test': 2, 'write': 3} 

または発電機のアプローチあなたに分割して解析をより詳細に制御を与えることがあります。

def gen(alist): 
    it = iter(alist) 
    while True: 
     yield (next(it),int(next(it))) 
In [68]: {k:v for k,v in gen(argv)} 
Out[68]: {'show': 1, 'test': 2, 'write': 3} 
関連する問題