コマンドライン引数の解析 (argparseモジュール) について

コマンドラインツールは、スクリプトを実行する際に引数を渡してプログラムの動作を制御できるため、非常に便利です。Pythonには、コマンドライン引数を簡単に解析するための標準ライブラリとして、argparseモジュールが用意されています。このモジュールを使うことで、引数の解析や処理を柔軟に行うことができ、ユーザーに対して使いやすいコマンドラインインターフェースを提供することが可能です。 この記事では、Pythonargparseモジュールを使ってコマンドライン引数を解析する基本的な方法から、より高度なサブコマンドやオプション引数の設定方法まで詳しく解説します

argparseモジュールの基本

argparseは、Pythonでコマンドライン引数を解析するためのモジュールで、以下のような機能を提供します。

  • コマンドライン引数の定義
  • 必須引数とオプション引数の解析
  • 引数のデフォルト値の設定
  • ヘルプメッセージの自動生成 まず、argparseを使う基本的な例を見ていきましょう。

基本的な使い方

次の例では、コマンドライン引数として名前を受け取り、指定された名前でメッセージを表示する簡単なスクリプトを作成します。

import argparse
# パーサーの作成
parser = argparse.ArgumentParser(description="名前を受け取って挨拶するスクリプト")
# 引数の追加
parser.add_argument('name', type=str, help="挨拶する相手の名前")
# 引数を解析
args = parser.parse_args()
# 挨拶メッセージを表示
print(f"こんにちは、{args.name}さん!")

実行方法

このスクリプトを実行すると、コマンドラインからname引数を指定して挨拶メッセージが表示されます。

$ python greet.py Alice
こんにちは、Aliceさん!

argparseの基本コンポーネント

  • ArgumentParser: コマンドライン引数を解析するためのオブジェクトを作成します。description引数を渡すことで、スクリプトの説明を指定できます。
  • add_argument: 解析する引数を定義します。必須引数やオプション引数を追加できます。
  • parse_args: コマンドライン引数を解析し、その結果を返します。解析された引数は、argsというオブジェクトに格納されます。

オプション引数の追加

argparseでは、オプション引数を簡単に追加できます。オプション引数は、プログラムの動作をカスタマイズするために使われ、コマンドラインで---で始まる名前を指定します。

オプション引数の例

次の例では、挨拶メッセージに追加のオプション引数として、言語を指定できるようにします。--lang引数を使って、英語または日本語の挨拶を選べます。

import argparse
# パーサーの作成
parser = argparse.ArgumentParser(description="名前を受け取って挨拶するスクリプト")
# 必須引数の追加
parser.add_argument('name', type=str, help="挨拶する相手の名前")
# オプション引数の追加(デフォルトは日本語)
parser.add_argument('--lang', type=str, choices=['en', 'jp'], default='jp', help="挨拶の言語を指定 (en または jp)")
# 引数を解析
args = parser.parse_args()
# 挨拶メッセージを表示
if args.lang == 'en':
    print(f"Hello, {args.name}!")
else:
    print(f"こんにちは、{args.name}さん!")

実行方法

$ python greet.py Alice
こんにちは、Aliceさん!
$ python greet.py Alice --lang en
Hello, Alice!

オプション引数の設定

  • --lang: オプション引数。--または-で始まる引数はオプション引数として扱われます。
  • choices: 指定可能な選択肢をリストで指定します。この例では、enjpを選べます。
  • default: オプション引数が指定されなかった場合のデフォルト値を指定します。

引数の型とデフォルト値の設定

argparseを使えば、引数の型を指定したり、デフォルト値を設定することができます。

引数の型を指定する

例えば、数値の引数を受け取る場合は、type引数でデータ型を指定します。

parser.add_argument('--age', type=int, help="年齢を指定する")

デフォルト値の設定

オプション引数にはデフォルト値を指定することが可能です。指定されなかった場合は、このデフォルト値が使われます。

parser.add_argument('--count', type=int, default=1, help="繰り返す回数 (デフォルト: 1)")

このように、引数の型やデフォルト値を設定することで、柔軟なコマンドラインツールを作成できます

サブコマンドの追加

サブコマンドは、複数の異なるコマンドを一つのツール内にまとめるために使われます。GitやDockerなどのコマンドラインツールが、git commitdocker runのように複数のサブコマンドを提供しているのと同様に、argparseでもサブコマンドを実装できます。

サブコマンドの例

以下の例では、addsubtractの2つのサブコマンドを持つ簡単な計算ツールを作成します。

import argparse
# パーサーの作成
parser = argparse.ArgumentParser(description="サブコマンドで簡単な計算を行うツール")
# サブコマンドの追加
subparsers = parser.add_subparsers(dest='command', help="サブコマンドを指定")
# add コマンド
add_parser = subparsers.add_parser('add', help="2つの数を加算する")
add_parser.add_argument
('x', type=int, help="最初の数")
add_parser.add_argument('y', type=int, help="2番目の数")
# subtract コマンド
subtract_parser = subparsers.add_parser('subtract', help="2つの数を減算する")
subtract_parser.add_argument('x', type=int, help="最初の数")
subtract_parser.add_argument('y', type=int, help="2番目の数")
# 引数を解析
args = parser.parse_args()
# サブコマンドの実行
if args.command == 'add':
    result = args.x + args.y
    print(f"結果: {result}")
elif args.command == 'subtract':
    result = args.x - args.y
    print(f"結果: {result}")

実行方法

$ python calc.py add 10 5
結果: 15
$ python calc.py subtract 10 5
結果: 5

サブコマンドの設定

  • add_subparsers: サブコマンドを追加するためのメソッド。サブコマンドごとに引数やオプションを設定できます。
  • dest: 解析結果に格納されるサブコマンドの名前。 このようにサブコマンドを利用すれば、複数の機能を持つ複雑なコマンドラインツールを作成することができます。

自動的に生成されるヘルプメッセージ

argparseは、指定された引数に基づいて自動的にヘルプメッセージを生成してくれます。プログラムの使い方がわからないとき、ユーザーは-hまたは--helpオプションを指定することで、利用可能な引数やサブコマンドのリストを確認できます。

ヘルプメッセージの表示

$ python calc.py -h
usage: calc.py [-h] {add,subtract} ...
サブコマンドで簡単な計算を行うツール
positional arguments:
  {add,subtract}  サブコマンドを指定
    add           2つの数を加算する
    subtract      2つの数を減算する
optional arguments:
  -h, --help      show this help message and exit

このように、argparseは引数の情報を自動的に整理し、ユーザーフレンドリーなヘルプメッセージを生成してくれるため、ドキュメント作成の手間が省けます。

まとめ

Pythonargparseモジュールを使えば、簡単にコマンドライン引数を解析し、柔軟なコマンドラインツールを作成することができます。必須引数やオプション引数の指定、サブコマンドの追加、ヘルプメッセージの自動生成といった機能を活用することで、ユーザーフレンドリーなプログラムを提供することが可能です。 コマンドラインツールを作成する際には、ぜひargparseを使って効率的に引数の処理を行いましょう。