Pythonでコマンドライン引数を扱う:argparseの使い方をマスターする

コマンドラインインターフェース (CLI) を持つアプリケーションを作成する際に、ユーザーからの入力を受け取るための仕組みが必要です。Pythonでは、argparse モジュールが、コマンドライン引数を解析し、プログラム内で簡単に利用できるようにする強力なツールを提供します。この記事では、argparse の基本的な使い方から、高度な機能まで、網羅的に解説します。

コマンドライン引数の解析:argparse の基本

argparse は、Python標準ライブラリに含まれているモジュールであり、コマンドライン引数を解析するための便利な機能を提供します。argparse を使うことで、ユーザーがプログラムに渡す引数を簡単に処理できるようになります。

基本的な流れ

  1. ArgumentParser オブジェクトを作成: プログラムの引数を解析するための ArgumentParser オブジェクトを作成します。
  2. add_argument() メソッドで引数を追加: add_argument() メソッドを使って、受け取る引数とその属性を定義します。
  3. parse_args() で引数を解析: parse_args() メソッドを実行すると、コマンドライン引数を解析し、その結果を Namespace オブジェクトとして返します。
  4. Namespace オブジェクトから引数にアクセス: 解析された引数は、Namespace オブジェクトの属性としてアクセスできます。

シンプルなサンプル

import argparse

# ArgumentParser オブジェクトを作成
parser = argparse.ArgumentParser(description="サンプルスクリプトの説明文")

# 必須引数を追加
parser.add_argument("name", help="ユーザーの名前")

# オプション引数を追加
parser.add_argument("-a", "--age", type=int, help="ユーザーの年齢")

# 引数の解析
args = parser.parse_args()

# 使用例
print(f"こんにちは、{args.name}さん!")
if args.age:
    print(f"あなたは {args.age} 歳です。")

上記のコードでは、ユーザーの名前 (name) と年齢 (age) を受け取ります。name は必須引数で、age はオプション引数です。type=int は、age 引数を整数型に変換することを指定します。

add_argument() のオプション

add_argument() メソッドは、さまざまなオプションを使用して、引数の挙動をカスタマイズできます。

必須の位置引数: 引数名を指定するだけで、必須の位置引数として追加されます。

parser.add_argument("username", help="ユーザー名")

オプション引数: ハイフン (-) またはダブルハイフン (–) で始まる名前を指定すると、オプション引数になります。

parser.add_argument("-v", "--verbose", action="store_true", help="詳細モードを有効にします")

type オプション: 引数のデータ型を指定できます。指定されたデータ型に自動変換されます。

parser.add_argument("count", type=int, help="処理回数")

default オプション: 引数が指定されなかった場合のデフォルト値を設定します。

parser.add_argument("--output", default="result.txt", help="出力ファイル名")

choices オプション: 引数に指定できる値を限定します。

parser.add_argument("--mode", choices=["easy", "medium", "hard"], help="難易度の選択")

required オプション: オプション引数を必須にする場合に使います。

parser.add_argument("--config", required=True, help="設定ファイルのパス")

action の設定

action オプションを使って、引数の解釈方法を制御できます。

store_true / store_false: フラグ(スイッチ)の引数として設定。指定するとTrue/Falseに設定されます。

parser.add_argument("-d", "--debug", action="store_true", help="デバッグモードを有効にします")

append: 同じオプションを複数回指定した場合、それらの値をリストに追加します。

parser.add_argument("--tag", action="append", help="タグを追加します")

count: オプションが指定される回数をカウントします(例: -vvvで3回カウント)。

parser.add_argument("-v", "--verbose", action="count", help="詳細モードのレベルを指定します")

ArgumentParser の設定オプション

ArgumentParser オブジェクトには、プログラムの説明文やヘルプメッセージをカスタマイズするためのオプションがあります。

  • description: プログラムの説明文を設定します。
  • epilog: ヘルプメッセージの最後に追加するメッセージ。
parser = argparse.ArgumentParser(
    description="このプログラムはサンプルです。",
    epilog="実行方法に関する追加の情報"
)

サブコマンドの設定

add_subparsers() メソッドを使って、GitやDockerのようにサブコマンドを設定できます。

# サブコマンド用のArgumentParserオブジェクトを作成
parser = argparse.ArgumentParser(description="サブコマンドのサンプル")
subparsers = parser.add_subparsers(dest="command")

# "install"コマンドを追加
install_parser = subparsers.add_parser("install", help="インストールを実行します")
install_parser.add_argument("package", help="インストールするパッケージ名")

# "remove"コマンドを追加
remove_parser = subparsers.add_parser("remove", help="削除を実行します")
remove_parser.add_argument("package", help="削除するパッケージ名")

args = parser.parse_args()

if args.command == "install":
    print(f"{args.package} をインストールします")
elif args.command == "remove":
    print(f"{args.package} を削除します")

parse_args() の戻り値の利用

parse_args() は、Namespace オブジェクトを返します。指定した引数は、このオブジェクトの属性としてアクセスできます。

args = parser.parse_args()
print(args.username)  # 位置引数
print(args.verbose)   # オプション引数

ヘルプメッセージのカスタマイズ

自動で生成されるヘルプメッセージは –help または -h オプションで表示できます。引数に help オプションを設定すると、個別の引数の説明が表示されます。

parser = argparse.ArgumentParser(description="カスタムヘルプメッセージのサンプル")
parser.add_argument("input", help="入力ファイルのパス")
parser.add_argument("-o", "--output", help="出力ファイルのパス")
args = parser.parse_args()

実装例

サンプルコード

import argparse

# ArgumentParser オブジェクト作成
parser = argparse.ArgumentParser(
    description="コマンドライン引数の例",
    epilog="このスクリプトはサンプルです。"
)

# 必須の位置引数
parser.add_argument("input_file", help="入力ファイルのパス")

# オプション引数
parser.add_argument("-o", "--output", default="output.txt", help="出力ファイル")
parser.add_argument("-v", "--verbose", action="count", help="詳細モードのレベル指定")
parser.add_argument("-l", "--level", choices=["error", "warning", "info"], required=True, help="ログレベル")
parser.add_argument("--tags", action="append", help="タグを追加")

# 引数の解析
args = parser.parse_args()

# 処理
print(f"入力ファイル: {args.input_file}")
print(f"出力ファイル: {args.output}")
print(f"詳細モードのレベル: {args.verbose}")
print(f"ログレベル: {args.level}")
print(f"タグ: {args.tags}")

実行コマンド例

python D:\Pythonテスト\ParseArgs\ArgsParse.py test -l error

実行結果

実行例: 必須項目のみの入力

PS D:\Pythonテスト\ParseArgs> python D:\Pythonテスト\ParseArgs\ArgsParse.py test -l error
入力ファイル: test
出力ファイル: output.txt
詳細モードのレベル: None
ログレベル: error
タグ: None

実行例: 引数設定忘れ

PS D:\Pythonテスト\ParseArgs> python D:\Pythonテスト\ParseArgs\ArgsParse.py
usage: ArgsParse.py [-h] [-o OUTPUT] [-v] -l {error,warning,info} [--tags TAGS] input_file
ArgsParse.py: error: the following arguments are required: input_file, -l/--level

9. まとめ

argparse は、Pythonでコマンドライン引数を解析するための強力なツールです。このモジュールを利用することで、ユーザーフレンドリーで機能的なCLIアプリケーションを簡単に開発できます。

コマンドライン引数ありのプログラムをVSCodeでデバッグしたい場合はこちらを参照ください。

この記事では、argparse の基本的な使い方から、高度な機能までを網羅的に解説しました。この記事が、argparse を活用して、より洗練されたコマンドラインアプリケーションを開発する手助けになれば幸いです。

にいやん

出身 : 関西 居住区 : 関西 職業 : 組み込み機器エンジニア (エンジニア歴13年) 年齢 : 38歳(2022年11月現在) 最近 業務の効率化で噂もありPython言語に興味を持ち勉強しています。 そこで学んだことを記事にして皆さんとシェアさせていただければと思いブログをはじめました!! 興味ある記事があれば皆さん見ていってください!! にほんブログ村