開始するには、argparseが提供するものを検討してください。
Argparseは、以下のためのエレガントなツールです。
- sys.argv引数の解析
- 文字列引数をプログラムのオブジェクトに変換し、それらを操作します。
- 情報プロンプトのフォーマットと表示。
- はるかに。
Pythonにargparseを含めることの反対者の議論の1つは、コマンドラインパラメータのセマンティック処理(解析)のために、標準モジュールに2つのライブラリさえ含まれているという議論でした。 ただし、argparseの開発者は、getoptとoptparseはいくつかの理由でargparseに劣ると主張しています。
- 通常のコマンドラインパラメーターを使用してアクションのすべての完全性を保持しているため、位置引数を処理できません。 位置引数は、このプログラムに転送される順序に応じて、プログラムの動作に影響する引数です。 最も単純な例は、少なくとも2つの引数(「cp source destination」)を持つcpプログラムです。
- argparseは、最小限のコストでより良いヒントメッセージを出力で提供します(この点に関して、optparseを使用する場合、コードの冗長性をしばしば観察できます)。
- argparseを使用すると、プログラマはどの文字がパラメータで、どの文字がパラメータではないかを自分で設定できます。 対照的に、optparseは「-pf、-file、+ rgb、/ fなど」のような構文を持つオプションを内部的に矛盾し、optparsでサポートされていない「and」を考慮します。
- argparseを使用すると、単一のコマンドライン引数(nargs)に対して複数の変数値を使用できます。
- 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ドキュメント
コマンドラインオプション、引数、サブコマンドのパーサー