【Python】ArgumentParserでコマンドライン引数を取得する方法

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.supermodeTrueになります。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に指定できる値はnormalsuperのどちらかです。それ以外の値を指定すると、次のようにエラー出力が出て、プログラムが終了します。

$ 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の機能はまだありますが、ここに紹介した機能だけで、ほとんどのプログラムのコマンドライン引数の取得処理を書くことができると思います。

著書紹介

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Akira Hayashi (林 晃)のアバター Akira Hayashi (林 晃) Representative(代表), Software Engineer(ソフトウェアエンジニア)

アールケー開発代表。Appleプラットフォーム向けの開発を専門としているソフトウェアエンジニア。ソフトウェアの受託開発、技術書執筆、技術指導・セミナー講師。note, Medium, LinkedIn
-
Representative of RK Kaihatsu. Software Engineer Specializing in Development for the Apple Platform. Specializing in contract software development, technical writing, and serving as a tech workshop lecturer. note, Medium, LinkedIn

目次