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

投稿者プロフィール

林 晃
林 晃macOS/iOSアプリ/SDK/ミドルウェア開発が専門の開発者
アールケー開発代表。macOS/iOSアプリ/SDK/ミドルウェア開発が専門の開発者。ObjC/Swift/C++使い。豊富な開発実務経験を基に、教育コンテンツ開発、技術書執筆、技術指導、技術セミナー講師、企業内研修講師、行政・自治体職員研修講師も行います。

基礎から学ぶMetal


「基礎から学ぶMetal」を執筆しました。本書はMetalを使ってGPUプログラミングを行うための最初のステップを解説するMetalの解説書です。

私が初めてGPUプログラミングを行ったとき、どこから手をつけて、学んでいけば良いのか分からず呆然としました。もし、あのとき、これを教えてくれればという部分を解説しました。本書で解説している部分はMetalの基礎となる部分で、Metalを使うときに必ず触れることになる部分です。

詳細

基礎から学ぶSwiftUI


「基礎から学ぶ SwiftUI」というタイトルの本を執筆しました。

SwiftUIの入門書です。

SwiftUIのコンセプトは「ユーザーインターフェイスを作るための最短パスを提供する」「一度学べば(Appleのプラットフォームの)どこにでも適用できる」です。

SwiftUIの概要から始まって、一つ一つのテクノロジートピックに注目しながらSwiftUIとは何か?どんなことができるのか?どのようなコードを書けば良いのかなどを丸々一冊使って解説しています。

詳細

関連記事

  1. SwiftからC言語の関数を使う

  2. Xcodeでフレームワークや共有ライブラリの出力シンボルを制御する

  3. Combine入門 | CombineでTimer処理を行う方法

  4. M1 MacにFlutterをセットアップする

  5. 【Docker】 macOS Catalina 10.15 で使うとき…

  6. 【Python】loggingを使ってログを出力する

最近の著書

  1. 基礎から学ぶ SwiftUI

人気記事

最近の記事