Pythonのコマンドライン引数を徹底解説|sys.argvとargparseの使い方

1. Pythonでのコマンドライン引数の基本的な使い方

コマンドライン引数とは?

Pythonプログラムを実行するときに、実行コマンドと一緒に渡す追加の情報を「コマンドライン引数」といいます。これにより、プログラムの動作を柔軟に変化させたり、外部からデータを簡単に渡したりすることが可能になります。たとえば、ファイル名や設定値を引数として渡すことで、プログラムの内容を動的に変更できます。

sys.argvを使用したコマンドライン引数の取得

Pythonでは、標準ライブラリであるsysモジュールを使用して、コマンドライン引数を取得することができます。sys.argvは、コマンドライン引数をリスト形式で格納している変数です。リストの最初の要素(sys.argv[0])は実行されるスクリプト名で、2番目以降の要素が引数として渡された値となります。

サンプルコード: 簡単な計算プログラム

import sys

def main():
    if len(sys.argv) < 3:
        print("エラー: 2つの引数が必要です")
        return

    num1 = float(sys.argv[1])
    num2 = float(sys.argv[2])
    print(f"合計: {num1 + num2}")

if __name__ == "__main__":
    main()

上記のプログラムは、コマンドラインから渡された2つの数値を合計して表示します。実行例は以下の通りです。

$ python script.py 3 5
合計: 8.0

 

2. argparseモジュールでの高度な引数処理

argparseの基本

sys.argvでは基本的な引数の取得が可能ですが、引数の数が多くなったり、オプション引数やフラグ(--verboseなど)を使用する場合は、標準ライブラリであるargparseモジュールが便利です。このモジュールを使うと、引数の解析や、エラーメッセージの自動生成が簡単に行えます。

引数の解析とパーサーの作成

argparseを使うには、まず引数を解析するためのパーサーを作成します。次に、パーサーに引数の設定を行い、実際にコマンドライン引数を解析していきます。

サンプルコード: 基本的なargparseの使い方

import argparse

def main():
    parser = argparse.ArgumentParser(description='サンプルプログラムです')
    parser.add_argument('arg1', help='最初の引数')
    parser.add_argument('arg2', type=float, help='2番目の数値引数')
    args = parser.parse_args()

    print(f"arg1 = {args.arg1}")
    print(f"arg2 = {args.arg2}")

if __name__ == "__main__":
    main()

このプログラムでは、2つの引数を受け取ります。arg1は文字列として、arg2は数値として扱われ、解析後に出力されます。

$ python script.py test 5.5
arg1 = test
arg2 = 5.5

オプション引数とフラグの処理

argparseの強力な機能として、オプション引数やフラグがあります。これにより、引数が指定された場合にのみ動作するコードを書いたり、詳細な出力(--verboseフラグなど)を提供することが可能です。

サンプルコード: オプション引数とフラグの使用

import argparse

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--verbose', action='store_true', help='詳細な出力を表示')
    parser.add_argument('numbers', nargs='+', type=float, help='数値のリスト')
    args = parser.parse_args()

    total = sum(args.numbers)
    if args.verbose:
        print(f"計算詳細: {args.numbers} の合計は {total} です")
    else:
        print(f"合計: {total}")

if __name__ == "__main__":
    main()

このプログラムでは、--verboseというフラグが指定されると詳細な出力が行われ、指定されなければシンプルな結果が表示されます。

$ python script.py 1 2 3 --verbose
計算詳細: [1.0, 2.0, 3.0] の合計は 6.0 です

 

3. エラーハンドリングと引数の検証

引数の数と型の検証

コマンドライン引数を扱う際には、ユーザーが正しく引数を提供しない場合にエラーメッセージを表示し、プログラムの誤動作を防ぐことが重要です。引数の数や型が期待通りであるかを検証することで、プログラムの安定性を保つことができます。

サンプルコード: 引数の数と型の検証

import sys

def main():
    if len(sys.argv) != 3:
        print("エラー: 2つの引数が必要です")
        return

    try:
        num1 = float(sys.argv[1])
        num2 = float(sys.argv[2])
    except ValueError:
        print("エラー: 引数は数値でなければなりません")
        return

    print(f"合計: {num1 + num2}")

if __name__ == "__main__":
    main()

このプログラムでは、引数の数が3つ(スクリプト名+2つの数値)でなければエラーメッセージを表示し、数値でない引数が渡された場合もエラーメッセージを表示します。

4. 実際のユースケースと応用

コマンドラインツールの作成例

コマンドライン引数を使った実用的な例として、ファイル操作やデータ処理を行うコマンドラインツールを作成することが考えられます。

サンプルコード: ファイルの内容をカウントするツール

import argparse

def main():
    parser = argparse.ArgumentParser(description='ファイルの行数をカウントするツール')
    parser.add_argument('filename', help='カウントするファイル名')
    args = parser.parse_args()

    try:
        with open(args.filename, 'r') as file:
            lines = file.readlines()
            print(f"ファイル {args.filename} の行数: {len(lines)}")
    except FileNotFoundError:
        print(f"エラー: ファイル {args.filename} が見つかりません")

if __name__ == "__main__":
    main()

このツールは、指定したファイルの行数をカウントして出力します。

$ python count_lines.py example.txt
ファイル example.txt の行数: 100

 

5. まとめ

Pythonでのコマンドライン引数の取り扱い方法を学ぶことで、プログラムに柔軟性を持たせることができます。sys.argvを使ったシンプルな方法から、argparseによる複雑な引数処理まで、実際のニーズに応じて適切な手法を選択することが重要です。また、エラーハンドリングや引数の検証を取り入れることで、より堅牢なプログラムを作成することが可能です。