Pythonの標準ライブラリargparse
は、スクリプトにコマンドライン引数を簡単に追加できる便利なツールです。ユーザーに特定の引数を指定させたり、ある引数を選択すると他の引数を無効にするなどの制約を設けたりすることが可能です。この記事では、argparse
の基本的な使い方として、「位置引数」「オプション引数」「相互排他グループ」の3つについて詳しく解説します。
目次
1. 位置引数の設定
位置引数は、スクリプト実行時に順番通りに指定する引数です。位置引数は必須であり、ユーザーは指定された順序で引数を入力する必要があります。
例えば、「入力ファイル」と「出力ファイル」のパスを指定する位置引数を定義する例です。
import argparse
def main():
# ArgumentParserのインスタンスを作成
parser = argparse.ArgumentParser(description="Sample script with positional arguments.")
# 位置引数を追加
parser.add_argument("input_file", type=str, help="Path to the input file")
parser.add_argument("output_file", type=str, help="Path to the output file")
# 引数をパース
args = parser.parse_args()
print(f"Input file: {args.input_file}")
print(f"Output file: {args.output_file}")
if __name__ == "__main__":
main()
使用例
python script.py input.txt output.txt
注意点
input_file
やoutput_file
は必須です。- 指定しない場合や順番を間違えた場合はエラーになります。
2. オプション引数の設定
オプション引数は、指定が任意である引数です。短縮形(-v
)やロングオプション(--verbose
)で指定でき、デフォルト値を設定することも可能です。
以下の例では、詳細出力の有無を制御する--verbose
オプションと、繰り返し回数を指定する--iterations
オプションを追加しています。
import argparse
def main():
# ArgumentParserのインスタンスを作成
parser = argparse.ArgumentParser(description="Sample script with optional arguments.")
# 位置引数を追加
parser.add_argument("input_file", type=str, help="Path to the input file")
parser.add_argument("output_file", type=str, help="Path to the output file")
# オプション引数を追加
parser.add_argument("-v", "--verbose", action="store_true", help="Enable verbose output")
parser.add_argument("-n", "--iterations", type=int, default=10, help="Number of iterations (default: 10)")
# 引数をパース
args = parser.parse_args()
# 引数の処理
if args.verbose:
print("Verbose mode enabled")
print(f"Input file: {args.input_file}")
print(f"Output file: {args.output_file}")
print(f"Number of iterations: {args.iterations}")
if __name__ == "__main__":
main()
使用例
python script.py input.txt output.txt -v -n 5
-v
または--verbose
を指定すると、詳細モードが有効になります。-n
または--iterations
で繰り返し回数を指定し、デフォルトは10
に設定しています。
3. 相互排他グループの設定
相互排他グループは、特定のオプションの組み合わせを許可しないように設定する機能です。あるオプションを選択すると他のオプションが無効になります。これは、parser.add_mutually_exclusive_group()
メソッドを使用して設定します。
以下の例では、--mode1
と--mode2
が相互排他の関係にあり、同時に指定することはできません。
import argparse
def main():
# ArgumentParserのインスタンスを作成
parser = argparse.ArgumentParser(description="Sample script with mutually exclusive options.")
# 相互排他グループの作成
group = parser.add_mutually_exclusive_group(required=True)
# グループ内のオプションを追加
group.add_argument("--mode1", action="store_true", help="Run in mode 1")
group.add_argument("--mode2", action="store_true", help="Run in mode 2")
# その他のオプションを追加
parser.add_argument("-v", "--verbose", action="store_true", help="Enable verbose output")
parser.add_argument("-n", "--iterations", type=int, default=10, help="Number of iterations (default: 10)")
# 引数をパース
args = parser.parse_args()
# 引数の処理
if args.verbose:
print("Verbose mode enabled")
if args.mode1:
print("Running in mode 1")
elif args.mode2:
print("Running in mode 2")
print(f"Number of iterations: {args.iterations}")
if __name__ == "__main__":
main()
使用例
python script.py --mode1 -v -n 5
python script.py --mode2 --iterations 20
エラー例
python script.py --mode1 --mode2
--mode1
と--mode2
は同時に指定するとエラーが発生します。- 相互排他グループの
required=True
により、どちらか一方の指定が必須になります。
まとめ
- 位置引数:必須で順番通りに指定する必要がある引数。
- オプション引数:任意で指定でき、デフォルト値を設定できる引数。
- 相互排他グループ:特定のオプションが選ばれると他のオプションが無効になる引数のグループ。
argparse
を活用することで、コマンドライン引数の処理が柔軟に設定でき、ユーザーフレンドリーなスクリプトが作成可能です。これを活用して、用途に応じたCLIツールを作成してみましょう。