2016-08-23 30 views
5

私はこのような私のスクリプトを使用したい:argparse:相互排他的な引数をオプションにする方法

python test.py run 
python test.py stop 

、私のコードは次のようである:そう

ValueError: mutually exclusive arguments must be optional 

:私はそれを実行したとき

parser = argparse.ArgumentParser() 
command_group = parser.add_mutually_exclusive_group(required=True) 
command_group.add_argument('run', help='run it', action='store_true') 
command_group.add_argument('stop', help='stop it', action='store_true') 

、例外が発生します各引数を追加するときにrequired=Falseを追加しようとしました。別の例外が発生します。

TypeError: 'required' is an invalid argument for positionals 

私は混乱しています。

+0

なぜ['choices'](https://docs.python.org/3/library/argparse.html#choices)ではなくmutexグループを使用するのですか? – kennytm

答えて

4

これを行うより良い方法は、2つの選択肢を持つことができる単一の位置引数を追加することです。あなたはそれはオプションになりたいので、0回または1回を意味し、nargs='?'を使用します。

parser = argparse.ArgumentParser() 
parser.add_argument('run', help='run or stop', nargs='?', choices=('run', 'stop')) 

runが与えられた場合、値は'run'になります。 stopを指定すると、'stop'となります。どちらも指定されていない場合はNoneになります。


本当に相互排他的なグループを使用したい場合は、あなたが望む通りに正確に行うことができるかどうかはわかりません。あなたは、しかし、ハイフンを追加することによって、それらにオプションの引数を行うことができます。

import argparse 

parser = argparse.ArgumentParser() 
command_group = parser.add_mutually_exclusive_group() 
command_group.add_argument('-run', help='run it', action='store_true') 
command_group.add_argument('-stop', help='stop it', action='store_true') 

もちろんそれに伴う問題は、ユーザーがまたハイフンを提供する必要があるが、それはあなたがあれば期待することができ、問題の一種だということですあなたはそれのように自分自身を制限する。

+0

ありがとう、それは動作します。しかし、本当にミューテックスグループを使用したいのであれば、どのようにコードを書くべきですか? – huron

+0

@huron:できるかどうかはわかりません。私の編集された答えを見てください。 – zondo

+0

私は参照してください。ありがとうございました! – huron

1

あなたはnargs='?'あなたが

python test.py run 

または

python test.py stop 

しかしない

でプログラムを呼び出すことができるようになる

parser = argparse.ArgumentParser() 
command_group = parser.add_mutually_exclusive_group() 
command_group.add_argument('run', help='run it', nargs='?') 
command_group.add_argument('stop', help='stop it', nargs='?') 

でこれを達成することができます

python test.py run stop 
関連する問題