Pythonでシェルスクリプトを作ったときに、ArgumentParser
クラスを使うと、簡単にコマンドライン引数を解析して取得できます。
ArgumentParser
クラスは、次のような機能を持っています。
- 順番が決まっている必須引数の解析・取得
- オプション引数(デフォルト値やフラグ型、値のタイプ指定なども対応)の解析・取得
- ヘルプ表示の対応
必須引数が指定されていないときは、エラーを表示して終了したりもできます。
文字列の解析処理を自分で書いて、コマンドライン引数オプションに対応するのは結構大変なので、このようなクラスが用意されているのは楽ですね。
基本的な使い方
使うときの基本形は次のようなコードです。
import argparse
# パーサーインスタンス確保
parser = argparse.ArgumentParser()
# 解析する引数をパーサーに登録
# コマンドライン引数を解析
# 解析された結果はargsに格納される
args = parser.parse_args()
# argsから解析した引数の値を取得して使う
プログラム説明を書く
プログラムの説明は、ArgumentParser
のイニシャライザで指定できます。
parser = argparse.ArgumentParser(description: "Demo program of ArgumentParser class")
書いた説明は--help
で表示されます。
$ python3 demo.py
usage: demo.py [-h]
Demo program of ArgumentParser class
optional arguments:
-h, --help show this help message and exit
プログラムや引数の説明は省略できます。しかし、省略しないことをお勧めします。
コードを実装した直後は当然、何のプログラムなのかが自分で分かっています。しかし、しばらく経つと忘れてしまうこともあるでしょう。また、引き継ぎをして、別の人が担当したときや、誰かに使ってもらうときなども説明があれば、渡すだけで済みます。
必須引数を解析・取得する
必須引数を解析・取得するには、add_argument()
メソッドを使います。
parser.add_argument("value", help="The value of required argument.")
value
という名前で必須引数を追加しています。help
は引数の説明です。省略することもできます。
指定された引数は次のようにして取得できます。
parser.add_argument("value", help="The value of required argument.")
args = parser.parse_args()
value = args.value
print(value)
parse_args()
メソッドの戻り値にコマンドライン引数は格納されています。格納されている値は、上記の様にparser.引数名
として取得します。
例えば、ABC
を指定して実行すると次のようになります。
$ python3 demo.py ABC
ABC
必須引数を指定しなかったときは、次のようにエラー出力を行ってプログラムは途中で終了します。
$ python3 demo.py
usage: demo.py [-h] value
demo.py: error: the following arguments are required: value
オプション引数を解析・取得する
オプション引数を解析・取得するのにも使用するメソッドはadd_argument()
メソッドです。
引数の名前を-
から始めるとオプション引数になります。
parser.add_argument("--level", help="The priority level.")
必須引数と同じように、次のように取得します。
args = parser.parse_args()
level = args.level
オプション引数は省略することができます。省略されたときはNull
が入っています。
オプション引数は別名(例えば、省略形)を定義することも多くあります。別名を定義するときは、add_argument()
の引数に列挙します。
parser.add_argument("-l", "--level", help="The priority level.")
取得するときは、--
を付けた方の名前で取得します。
フラグとして使う引数を取得する
値を指定しない、フラグとして使う引数を解析・取得するには、次のように書きます。
parser.add_argument("--supermode", action="store_true", help="Run as supermode.")
この場合は、--supermode
という引数が指定されると、args.supermode
がTrue
になります。args.supermode
の値がTrue
かどうかでオプションが指定されたかどうかを判定します。
デフォルト値を指定する
オプション引数で指定されていないときに、Null
ではなくデフォルト値になるようにすることもできます。
parser.add_argument("--level", default="1", help="The priority level.")
この場合、--level
が指定されなかったときは、1
になります。
引数の型を指定する
コマンドライン引数に渡された値を数値として使いたいときは、引数の型を指定する機能を使います。
parser.add_argument("--level", type=int, default="1", help="The priority level.")
この場合はint
として使えるようになります。type
を指定していないときは文字列になっています。
選択肢から指定する引数を作る
引数に自由に値を指定できるのではなく、選択肢の中から選ぶようにしたいときは、次のようにします。
parser.add_argument("--mode", choices=["normal", "super"], help="The running mode.")
この場合は、--mode
に指定できる値はnormal
とsuper
のどちらかです。それ以外の値を指定すると、次のようにエラー出力が出て、プログラムが終了します。
$ python3 demo.py --mode=foo
usage: demo.py [-h] [--mode {normal,super}]
demo.py: error: argument --mode: invalid choice: 'foo' (choose from 'normal', 'super')
複数の値を指定できる引数を作る
例えば、処理したいファイルを列挙して指定するというような使い方をしたいときは、次のような書き方をします。
parser.add_argument("target", nargs="*", help="Target Files")
parse_args()
の戻り値に格納される値は配列になります。nargs
は値の個数を指定します。具体的に2
などと書けば、値を2つ指定しなければいけない引数になります。
このコードのように*
を指定した場合は、0個以上、+
を指定した場合は最低1個となります。
まとめ
ArgumentParser
の機能はまだありますが、ここに紹介した機能だけで、ほとんどのプログラムのコマンドライン引数の取得処理を書くことができると思います。