Argparse-引数とコマンドラインオプションを簡単に解析

Python 2.7以降、argparseライブラリは、コマンドライン引数(パラメータ、キー)を処理するための一連の標準ライブラリに含まれています。 あなたの注意を止めたいです。



開始するには、argparseが提供するものを検討してください。



Argparseは、以下のためのエレガントなツールです。





Pythonにargparseを含めることの反対者の議論の1つは、コマンドラインパラメータのセマンティック処理(解析)のために、標準モジュールに2つのライブラリさえ含まれているという議論でした。 ただし、argparseの開発者は、getoptとoptparseはいくつかの理由でargparseに劣ると主張しています。





argparseの使用を開始するには、パーサーを指定する必要があります。



ap.py: import argparse parser = argparse.ArgumentParser(description='Great Description To Be Here')
      
      







さらに、パーサーは、どのオブジェクトを期待しているのかを示す必要があります。 特定の場合、次のようになります。



 parser.add_argument('-n', action='store', dest='n', help='Simple value')
      
      







この引数にアクションが指定されていない場合、デフォルトでは名前空間に保存(保存)されます。また、この引数のタイプ(int、booleanなど)も指定できます。 戻り引数の名前(dest)が指定されている場合、その値は対応する名前空間属性に格納されます。



私たちの場合:

 print parser.parse_args(['-n', '3']) Namespace(n='3') print parser.parse_args([]) Namespace(n=None) print parser.parse_args(['-a', '3']) error: unrecognized arguments: -a 3
      
      







位置引数(二乗)の値を二乗し、オプションの引数(-v)に応じて出力を生成するプログラムの簡単な例:



 import argparse parser = argparse.ArgumentParser() parser.add_argument("square", type=int, help="display a square of a given number") parser.add_argument("-v", "--verbose", action="store_true", help="increase output verbosity") args = parser.parse_args() answer = args.square**2 if args.verbose: print("the square of {} equals {}".format(args.square, answer)) else: print(answer)
      
      







アクションについて説明します。 次のようになります。

-store:名前空間に値を返します(オプションの型キャスト後)。 既に述べたように、storeはデフォルトのアクションです。



-store_const:主にフラグに使用されます。 constで指定された値を返すか、(何も指定されていない場合)Noneを返します。 例:



 parser.add_argument('--LifetheUniverseandEverything', action='store_const', const=42) print parser.parse_args(['--LifetheUniverseandEverything']) Namespace(LifetheUniverseandEverything=42)
      
      







-store_true / store_false: store_constに類似していますが、ブール値のTrueおよびFalseです。



-append:引数値を追加してリストを返します。 例:

 parser.add_argument('--l', action='append') print parser.parse_args('--la --lb --l Y'.split()) Namespace(l=['abY'])
      
      







-append_const:引数の指定で指定された値をリストに返します。 これまでのところ、append_constが必要になるケースはありません。



-count:名前が示すように、この引数の値が発生する回数をカウントします。 例:



 parser.add_argument('--verbose', '-v', action='count') print parser.parse_args('-vvv'.split()) Namespace(verbose=3)
      
      







パーサーのコンストラクターに渡される引数add_help(ブール型)に応じて、キー['-h'、 '--help']によって標準出力にヘルプメッセージを含めるかどうかが決定されます。 引数バージョン(文字列型)の場合も同じです。デフォルトのキーは['-v'、 '--version']です。 ヘルプまたはバージョン番号を要求すると、それ以上の実行は中断されます。



 parser = argparse.ArgumentParser(add_help=True, version='4.0')
      
      







プログラムのすべてのパーサーに適用されるコマンドラインパラメーターの特定のセットを定義する必要がある場合があります。 この場合、彼らはしばしば認可の必要性の例を示します:



 parent_parser = argparse.ArgumentParser(add_help=False) parent_parser.add_argument('--user', action="store") parent_parser.add_argument('--password', action="store") child_parser = argparse.ArgumentParser(parents=[parent_parser]) child_parser.add_argument('--show_all', action="store_true") print child_parser.parse_args(['--user', 'guest']) Namespace(password=None, show_all=False, user='guest')
      
      







親パーサーは、add_help = Falseパラメーターを使用して作成されることに注意してください。 これは、各パーサーが独自の '-h'キーハンドラーを正直に追加しようとするためであり、競合状況が発生します。 これは、子パーサーに親キーと同じキーがあり、競合することなくそれらを使用したい場合にどうするかという疑問を招きますか? これは単に引数conflict_handlerを追加することで行われます:



 parent_parser = argparse.ArgumentParser(add_help=False) parent_parser.add_argument('--user', action="store") parent_parser.add_argument('--password', action="store") child_parser = argparse.ArgumentParser(parents=[parent_parser], conflict_handler='resolve') child_parser.add_argument('--user', action="store", default="Guest") print child_parser.parse_args() Namespace(password=None, user='Guest')
      
      







さまざまなレベルでコマンドを処理する上記のアプローチに加えて、サブパーサーを使用して1つのプログラムですべてのコマンドの処理を組み合わせることができる代替アプローチもあります。 例は、それ自体を最もよく伝えます:



 ap.py import argparse parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(help='List of commands') # A list command list_parser = subparsers.add_parser('list', help='List contents') list_parser.add_argument('dirname', action='store', help='Directory to list') # A create command create_parser = subparsers.add_parser('create', help='Create a directory') create_parser.add_argument('dirname', action='store', help='New directory to create') create_parser.add_argument('--read-only', default=False, action='store_true', help='Set permissions to prevent writing to the directory', )
      
      







これは、 '-h'オプションを指定したプログラムが生成するものです。



usage: ap.py [-h] {list,create} ...



positional arguments:

{list,create} list of commands

list List contents

create Create a directory



optional arguments:

-h, --help show this help message and exit








この例では、次のことを確認できます。

1. 位置引数リスト、作成、プログラムに渡されます-基本的にサブパーサー。

2.サブパーサーの引数 `--read-only 'create_parser- オプション 、dir_name-両方のサブパーサーに必要。

3.ヘルプ(ヘルプ)は、パーサーと各サブパーサーの両方に提供されます。



一般的に、argparseは非常に強力で軽量なライブラリであり、私の意見では、コマンドラインパラメーターを操作するための非常に便利なインターフェイスを提供します。 次回は、ファイル引数(ファイルをより高度に処理するため)、変数引数リスト、引数のグループ、引数の入力に関する詳細な議論などの問題を取り上げます。

ご清聴ありがとうございました。



参照:

なぜgetoptとoptparseが十分でないのか(PEP 389)

argparseの位置引数とオプション引数

Argparseドキュメント

コマンドラインオプション、引数、サブコマンドのパーサー



All Articles