MENU

Pythonでargparseを使ってコマンドライン引数を処理するスニペット

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_fileoutput_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ツールを作成してみましょう。

目次