argparse
Python標準ライブラリに含まれるコマンドライン引数パーサー。基本的なCLI機能を提供し、追加の依存関係を必要としません。
フレームワーク
argparse
概要
argparseはPython標準ライブラリに含まれるコマンドライン引数パーサーです。追加の依存関係を必要とせず、基本的なCLI機能を提供します。型変換、検証、自動ヘルプ生成、サブコマンドサポートなど、堅牢なCLIアプリケーションの構築に必要な機能を備えています。
詳細
argparseはPython 2.7および3.2から標準ライブラリに追加され、以前のoptparseモジュールを置き換えました。標準ライブラリの一部として、追加のインストールなしで利用でき、依存関係を最小限に抑えたい場合に理想的な選択肢です。多くのPythonスクリプトやアプリケーションで使用されており、実績のあるソリューションです。
主な特徴
- 標準ライブラリ: 追加のインストールが不要
- 自動ヘルプ生成:
-h
、--help
でヘルプメッセージを自動生成 - 型変換とバリデーション: 引数の型指定と自動変換
- 位置引数とオプション引数: 両方をサポート
- サブコマンド: 複雑なCLI構造の作成が可能
- 相互排他グループ: 互いに排他的な引数の定義
- カスタムアクション: 独自の引数処理ロジックの実装
メリット・デメリット
メリット
- ゼロ依存関係: 標準ライブラリなので追加インストール不要
- 安定性: 長年にわたって使用されている実績のあるライブラリ
- 包括的な機能: 基本的なCLIアプリケーションに必要な機能をすべて提供
- 学習コスト: Pythonの標準ライブラリなので学習リソースが豊富
- 移植性: Python標準環境があればどこでも動作
デメリット
- 冗長な記述: より高度なライブラリと比較してコードが冗長になる場合がある
- 制限されたカスタマイズ: 外部ライブラリほど柔軟ではない
- サブコマンドの複雑さ: 複雑なサブコマンド構造は記述が煩雑
- エラーメッセージ: デフォルトのエラーメッセージがユーザーフレンドリーでない場合がある
主要リンク
書き方の例
import argparse
# 基本的な引数パーサーの作成
parser = argparse.ArgumentParser(description='ファイル処理ツール')
# 位置引数
parser.add_argument('filename', help='処理するファイル名')
# オプション引数
parser.add_argument('--output', '-o', help='出力ファイル名')
parser.add_argument('--verbose', '-v', action='store_true',
help='詳細な出力を有効にする')
parser.add_argument('--count', type=int, default=1,
help='繰り返し回数(デフォルト: 1)')
# 選択肢の制限
parser.add_argument('--format', choices=['json', 'xml', 'yaml'],
default='json', help='出力フォーマット')
# 複数の値を受け取る
parser.add_argument('--tags', nargs='+',
help='1つ以上のタグを指定')
# サブコマンドの例
subparsers = parser.add_subparsers(dest='command', help='利用可能なコマンド')
# 'process' サブコマンド
process_parser = subparsers.add_parser('process', help='ファイルを処理')
process_parser.add_argument('--mode', choices=['fast', 'thorough'],
default='fast', help='処理モード')
# 'validate' サブコマンド
validate_parser = subparsers.add_parser('validate', help='ファイルを検証')
validate_parser.add_argument('--strict', action='store_true',
help='厳密な検証を実行')
# 引数の解析
args = parser.parse_args()
# 引数の使用
if args.verbose:
print(f"処理中: {args.filename}")
print(f"出力: {args.output}")
print(f"フォーマット: {args.format}")
if args.command == 'process':
print(f"処理モード: {args.mode}")
elif args.command == 'validate':
if args.strict:
print("厳密な検証を実行中...")