--all
これはサブパーサーの問題とまったく同じように見えることに同意します。 andを使用してオプションの引数にしたくない場合は、 andを完全--name
に無視して、次のセマンティクスを使用することをお勧めします。 :all
name
tester.py
引数なしで呼び出された場合、すべてのプロセスを停止します。
- がいくつかの引数で呼び出された場合
tester.py
、それらのプロセスのみを停止します。
以下を使用して実行できます。
import argparse, sys
parser = argparse.ArgumentParser()
parser.add_argument('processes', nargs='*')
parsed = parser.parse(sys.argv[1:])
print parsed
次のように動作します。
$ python tester.py
名前空間(プロセス=[])
$ python tester.py proc1
名前空間 (プロセス = ['proc1'])
または、独自の構文を主張する場合は、カスタム クラスを作成できます。そして、実際には「相互に排他的なグループ」のケースはありません。 ifall
が指定されていると仮定しているため、残りの引数は (name
が他の引数の 1 つであっても)無視され、 が指定されている場合は、それ以降はすべて無視name
されます。プロセスの名前と見なされます。
import argparse
import sys
class AllOrName(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
if len(values)==0:
raise argparse.ArgumentError(self, 'too few arguments')
if values[0]=='all':
setattr(namespace, 'all', True)
elif values[0]=='name':
if len(values)==1:
raise argparse.ArgumentError(self, 'please specify at least one process name')
setattr(namespace, 'name', values[1:])
else:
raise argparse.ArgumentError(self, 'only "all" or "name" should be specified')
parser = argparse.ArgumentParser()
parser.add_argument('processes', nargs='*', action=AllOrName)
parsed = parser.parse_args(sys.argv[1:])
print parsed
次の動作で:
$ python argparse_test.py 名
使用法: argparse_test.py [-h] [プロセス [プロセス ...]]
argparse_test.py: エラー: 引数プロセス: 少なくとも 1 つのプロセス名を指定してください
$ python argparse_test.py 名前 proc1
名前空間(名前=['proc1']、プロセス=なし)
$ python argparse_test.py すべて
名前空間 (すべて = True、プロセス = なし)
$ python argparse_test.py ホスト
使用法: argparse_test.py [-h] [プロセス [プロセス ...]]
argparse_test.py: エラー: 引数プロセス: "all" または "name" のみを指定する必要があります
$ python argparse_test.py
使用法: argparse_test.py [-h] [プロセス [プロセス ...]]
argparse_test.py: エラー: 引数プロセス: 引数が少なすぎます