Pythonでコマンドライン引数をargparseモジュールを取得して処理する方法について解説します。
Contents
コマンドライン引数
コマンドライン引数とは、Pythonのプログラム実行時にコマンドラインで実行する際に指定する引数の事です。コマンドライン引数を指定することで、実行条件を変えるなどができ、プログラムの挙動を変更することができるようになります。
> python test.py 引数1 引数2
例えば、上記の例では「引数1」や「引数2」がコマンドライン引数です。上記は2つだけの例ですが、定義すれば任意の数の引数を使うことができます。
Pythonでシンプルにコマンドライン引数を使いたい場合はsysモジュールを使ったプログラムにするのがお手軽です。sysモジュールを用いた方法は「sysを用いたコマンドライン引数の取得方法」でまとめていますので、参考にしていただければと思います。
小さなスクリプトであればsysを用いた方法で十分ですが、実際に規模の大きい又は複雑なプログラムの開発をしていると、例えばですが以下のようなことがしたくなってきます。
- コマンドライン引数に関するヘルプを簡単に出力したい
- 値を受け取るだけでなく「-f filename」「–file filename」のようにオプション引数として分かりやすい引数指定がしたい
- 「-x」のように指定するだけで、機能の実行可否のフラグが設定されるようにしたい
上記のような少し高度なコマンドライン引数処理をする場合にはargparseモジュールが便利です。以降ではargparseモジュールの基本的な使い方を例を用いながら紹介していきたいと思います。
以前はoptparseというモジュールが使われていましたが、Python3.2から非推奨になりました。optparseは廃止予定でありこれ以上の開発は行われませんので、argparseモジュールの方を使用してください。
optparseの公式ドキュメントのこちらに上記の内容の記載があります。
argparseを用いたコマンドライン引数の取得方法
argparseモジュールを用いたコマンドライン引数の取得方法について、以下のサンプルプログラムを用いて説明します。以下例をPythonスクリプトのひな型としても活用いただけるかなと思います。
from argparse import ArgumentParser def main(): # ===== ArgumentParserの準備 # パーサーの準備 parser = ArgumentParser(description='スクリプトの説明') # 位置引数の設定 parser.add_argument('arg1', metavar='Num1', type=int, help='Num1の説明') parser.add_argument('arg2', metavar='Str1', type=str, help='Str1の説明') # オプション引数の設定 parser.add_argument('-x', action='store_true', dest='x_opt', help='実行オプション') parser.add_argument('-f', '--file', action='store', dest='filename', help='ファイル名オプション') # コマンドライン引数をパース(解析)する args = parser.parse_args() # ===== 取得した引数を取得する print(f'filename = {args.filename}') print(f'arg1 = {args.arg1}, {type(args.arg1)}') print(f'arg2 = {args.arg2}, {type(args.arg2)}') print(f'x_opt = {args.x_opt}') # ===== # 実行スクリプト内容を記載 print('===== スクリプト本体の実行 =====') print('..........') print('===== スクリプトの終了 =====') # ===== if __name__ == '__main__': main()
実行時にコマンドライン引数を指定するイメージは以下のようになります。
【実行例】 > python argparse_basic.py -x -f filename 100 text filename = filename arg1 = 100, <class 'int'> arg2 = text, <class 'str'> x_opt = True ===== スクリプト本体の実行 ===== .......... ===== スクリプトの終了 =====
-fの部分は–fileとしても同様の結果になります。
また、以下のようにコマンドラインからhelpを表示することができます。
【実行例】 > python argparse_basic.py -h usage: argparse_sample.py [-h] [-x] [-f FILENAME] Num1 Str1 スクリプトの説明 positional arguments: Num1 Num1の説明 Str1 Str1の説明 optional arguments: -h, --help show this help message and exit -x 実行オプション -f FILENAME, --file FILENAME ファイル名オプション
-hを–helpとしても同様の結果となります。具体的な引数の使用方法(usage)や引数にどういった種類があるのかが分かりやすく表示できていて分かりやすいです。
以降でプログラムの細部処理内容を順に解説していきます。
ArgumentParserの準備
from argparse import ArgumentParser # ===== ArgumentParserの準備 # パーサーの準備 parser = ArgumentParser(description='スクリプトの説明')
引数の解析にはargparserモジュールのArgumentParserクラスを使用します。上記のようにimportしたうえで、インスタンス化をして準備します。
引数に指定しているdescriptionはプログラムの説明です。ヘルプ実行例で「スクリプトの説明」という文字列が実際に表示されているのが分かるかと思います。
ArgumentParseでは、他にも引数指定できます。その他の引数を確認したい場合は、公式ドキュメントのこちらを参考にしてください。
引数の設定
引数には位置引数とオプション引数があります。位置引数はプログラム名の後に順に指定される位置が意味を持つ引数です。オプション引数は「-f」「–file」等の後に引数を指定する方法で任意の位置で指定できます。
いずれの引数でもadd_argumentメソッドを使用します。それぞれの指定の違いについて以降で説明します。
位置引数の設定
# 位置引数の設定 parser.add_argument('arg1', metavar='Num1', type=int, help='Num1の説明') parser.add_argument('arg2', metavar='Str1', type=str, help='Str1の説明')
位置引数を指定するためには上記のように指定します。それぞれの項目を簡単に説明します。
- ‘args1’や’args2’は、プログラムで後ほど使用する変数名です。
- metavarは、ヘルプでの表示名です。
- typeは、入力の型になります。例えば、ここでintと指定しているのに文字列をコマンドラインで指定してしまうとエラーとなります。
- helpは、ヘルプでの説明として表示される文字列です。
オプション引数の指定
# オプション引数の設定 parser.add_argument('-x', action='store_true', dest='x_opt', help='実行オプション') parser.add_argument('-f', '--file', action='store', dest='filename', help='ファイル名オプション')
オプション引数を指定するためには上記のように指定します。それぞれの項目を簡単に説明します。
- ‘-x’、’-f’、’–file’はオプション名として指定する文字列を指定します。
- actionは、どういった処置を行うかを指定します。actionは色々な種類がありますので、詳細はこちらを参照してみてください。
- destは、プログラムで後ほど使用する変数名です。
- helpは、ヘルプでの説明として表示される文字列です。
よく使うactionは「’store’で変数を格納する」「’store_true’でTrueを設定する」「’store_false’でFalseを設定する」といったものかなと思います。
例えば今回の例では、-xが指定されるとx_optにTrueが設定されますので、例えばXX処理の実行要否を決めるといったことができます。’store_false’は今回の例では出てきていませんが、指定されると逆にFalseが設定されます。
コマンドライン引数のパース(解析)
上記でコマンドライン引数の設定準備はほとんど完了です。後は以下のようにparse_argsメソッドでコマンドライン引数を解析した結果を取得することができます。
# コマンドライン引数をパース(解析)する args = parser.parse_args()
取得したコマンドライン引数の使用
# ===== 取得した引数を取得する print(f'filename = {args.filename}') print(f'arg1 = {args.arg1}, {type(args.arg1)}') print(f'arg2 = {args.arg2}, {type(args.arg2)}') print(f'x_opt = {args.x_opt}')
parse_argsで解析が完了すると設定した変数名にて上記のようにアクセスして使用することができるようになります。これらの引数を使って、以降のプログラムの入力にしたり、条件分岐で使用したりすることが可能です。
以上がargparseの基本的な使い方になります。
argparseの公式ドキュメントはこちらを参照してください。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。