Python argparseモジュールの詳しい説明
argparse は、コマンドライン引数を解析するための Python ライブラリであり、Python 標準ライブラリの一部です。Python 2.7 に基づく stdlib コード。argparse モジュールを使用すると、使いやすいコマンドライン インターフェイスを簡単に作成できます。プログラムは必要な引数を定義し、argparse はそれらを sys.argv から解析する方法を判断します。argparse モジュールは、ヘルプと使用法メッセージも自動的に生成し、ユーザーが無効な引数をプログラムに指定した場合にエラーを発行します。
円柱の体積計算の簡単な実装
argparse コマンド ライン パラメーター解析モジュールを理解しやすくするために、簡単なプログラムから始めます。
import math
def cylinder_volume(radius, height):
vol = (math.pi) * (radius ** 2) * height
return vol
if __name__ == '__main__':
print(cylinder_volume(2, 4))
PyCharm を通じてコードを実行すると、結果が表示されます。
コマンドラインからコードを実行すると、結果が表示されます。
コマンドライン方式を使用する場合は、実行する xxx.py ファイルが配置されているファイル ディレクトリに移動し、「python xxx.py」と入力する必要があることがわかります。
argparse モジュールを使用して円柱の体積を計算する
-
argparseモジュールをインポートする
import argparse
-
解析オブジェクトパーサーを作成する
parser = argparse.ArgumentParser(description='Calculate volume of a Cylinder')
このうちパーサ解析オブジェクトはパラメータをロードするためのコンテナに相当し、解析オブジェクトを記述するためにdescriptionが使用されます。
-
コマンドライン引数を追加する
parser.add_argument('radius', type=int, help='Radius of Cylinder') parser.add_argument('height', type=int, help='Height of Cylinder') args = parser.parse_args()
円柱の体積を計算する例では、必要なパラメータは半径と高さなので、この2つのパラメータを解析オブジェクトに追加する必要があります。パラメータの型はint型として定義されており、ヘルプを使用して説明します。パラメータです。
-
元の関数の引数をコマンドライン引数に置き換えます
print(cylinder_volume(args.radius, args.height))
-
完全なコード再現
import math import argparse parser = argparse.ArgumentParser(description='Calculate volume of a Cylinder') parser.add_argument('radius', type=int, help='Radius of Cylinder') parser.add_argument('height', type=int, help='Height of Cylinder') args = parser.parse_args() def cylinder_volume(radius, height): vol = (math.pi) * (radius ** 2) * height return vol if __name__ == '__main__': print(cylinder_volume(args.radius, args.height))
-
コードを実行する
PyCharm でコードを直接実行すると、結果は次のようになります。
このコードはパラメータを渡す必要があるため、PyCharm はエラーを直接報告します。
コマンドラインからコードを実行すると、結果は次のようになります。
結果は以前と同じであることがわかります。
次に、 --help または -h パラメータを呼び出して、プログラムの説明を表示します。
ここで、以前に渡されたパラメータの順序を変更しようとしました。結果は次のようになります。
結果がまったく異なることがわかります。ヘルプのプロンプト情報から、渡されたパラメーターは厳密な順序で実行する必要があることがわかります。しかし、日常生活では、多数のパラメーターが関係する可能性があります。パラメータの順序があまり良くありません。メモリ、この時点で、元のコードを変更して、オプションのパラメータを使用できるようにすることができます。
parser.add_argument('-r', '--radius', type=int, help='Radius of Cylinder')
parser.add_argument('-H', '--height', type=int, help='Height of Cylinder')
ここで、「-h」パラメータは help コマンドによって占有されているため、高さには「-H」を使用することに注意してください。
コードを再度実行した場合の表示結果は次のとおりです。
ここで、「-h」を渡してプログラムの説明を表示します。
上記の説明をより簡潔にしたい場合は、コードを変更できます。
parser.add_argument('-r', '--radius', type=int, metavar='', help='Radius of Cylinder')
parser.add_argument('-H', '--height', type=int, metavar='', help='Height of Cylinder')
ここで、再度「-h」を渡して効果を確認します。
それでは、パラメータを 1 つだけ入力した場合、結果はどうなるでしょうか?
エラー メッセージでは、特定の値を指定しないパラメーターには値 None が割り当てられることがわかります。この状況を回避するには、コードを次のように変更します。
parser.add_argument('-r', '--radius', type=int, metavar='', required=True, help='Radius of Cylinder')
parser.add_argument('-H', '--height', type=int, metavar='', required=True, help='Height of Cylinder')
もう一度やってみましょう:
この時点で、追加する必要があるパラメータの入力を求めるプロンプトが表示されることがわかります。
相互排他パラメータの概要
次に、ミューテックス グループを追加してみます。
group = parser.add_mutually_exclusive_group()
group.add_argument('-q', '--quiet', action='store_true', help='print quiet')
group.add_argument('-v', '--verbose', action='store_true', help='print verbose')
まずグループ コンテナを作成し、それにパラメータを追加します。アクション パラメータを 'store_true' に割り当てることは、コマンドに '-q' または '--quit' ('-v' または '--verbose') を追加することを意味します。を指定すると、プログラムは args.quit に true を割り当てます。デフォルトでは false です。次に、この原則を使用して、main 関数の内容を変更できます。
volume = cylinder_volume(args.radius, args.height)
if args.quiet:
print("quiet: %s" % volume)
elif args.verbose:
print("verbose: %s" % volume)
else:
print("Volume of a Cylinder with radius %s and height %s is %s" % (args.radius, args.height, volume))
次に、コマンド ライン テストを実行して効果を確認します。
なお、相互排除の意味は、相互排他グループに同時に含めることができないパラメータ、つまり 1 つのパラメータのみを設定できることを指します。を渡すと、次のエラー メッセージが表示されます。
フルバージョンの改良されたコード
import math
import argparse
parser = argparse.ArgumentParser(description='Calculate volume of a Cylinder')
parser.add_argument('-r', '--radius', type=int, metavar='', required=True, help='Radius of Cylinder')
parser.add_argument('-H', '--height', type=int, metavar='', required=True, help='Height of Cylinder')
group = parser.add_mutually_exclusive_group()
group.add_argument('-q', '--quiet', action='store_true', help='print quiet')
group.add_argument('-v', '--verbose', action='store_true', help='print verbose')
args = parser.parse_args()
def cylinder_volume(radius, height):
vol = (math.pi) * (radius ** 2) * height
return vol
if __name__ == '__main__':
volume = cylinder_volume(args.radius, args.height)
if args.quiet:
print("quiet: %s" % volume)
elif args.verbose:
print("verbose: %s" % volume)
else:
print("Volume of a Cylinder with radius %s and height %s is %s" % (args.radius, args.height, volume))