Pythonでコマンドライン引数を扱う方法:スクリプトをより柔軟に!


Pythonスクリプトを開発していると、「実行時に特定の情報を渡したい」「設定ファイルを変更せずに動作を変えたい」といったニーズが出てきます。そんな時に非常に役立つのがコマンドライン引数です。コマンドライン引数を使うことで、スクリプトの柔軟性が格段に上がり、さまざまな状況に対応できるようになります。この記事では、Pythonでコマンドライン引数を扱うための基本的な方法と、より高度なargparseモジュールの使い方を分かりやすく解説します。

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

コマンドライン引数とは、Pythonスクリプトを実行する際に、スクリプト名の後に続く文字列のことです。これらの文字列は、スクリプト内で特別な意味を持つ情報として利用されます。

例えば、python my_script.py input.txt output.csv というコマンドを実行した場合、input.txtoutput.csvがコマンドライン引数となります。


sys.argvを使った基本的な引数取得

Pythonで最もシンプルにコマンドライン引数を取得する方法は、標準ライブラリのsysモジュールを使用することです。sys.argvは、スクリプトに渡された引数のリストを格納しています。

1. sys.argvの基本

sys.argvリストの最初の要素(sys.argv[0])は、常に実行しているスクリプトのファイル名になります。それ以降の要素(sys.argv[1], sys.argv[2]など)が、渡されたコマンドライン引数です。

Python
 
# get_args.py
import sys

print(f"スクリプト名: {sys.argv[0]}")
print(f"引数の数: {len(sys.argv) - 1}") # スクリプト名を除く
print(f"すべての引数: {sys.argv}")

if len(sys.argv) > 1:
    print(f"最初の引数: {sys.argv[1]}")

上記のスクリプトを保存し、コマンドラインから実行してみましょう。

Bash
 
python get_args.py hello world 123
# 出力例:
# スクリプト名: get_args.py
# 引数の数: 3
# すべての引数: ['get_args.py', 'hello', 'world', '123']
# 最初の引数: hello

2. sys.argvの注意点

sys.argvは非常にシンプルですが、以下の点に注意が必要です。

  • すべて文字列: 渡される引数はすべて文字列として扱われます。数値として利用する場合は、int()float()などで型変換が必要です。

  • 引数のチェック: 引数の数が不足していないか、予期せぬ引数が渡されていないかなどを、自分でチェックする必要があります。

Python
 
# calculate.py
import sys

if len(sys.argv) < 3:
    print("使い方: python calculate.py <数値1> <数値2>")
    sys.exit(1) # エラー終了

try:
    num1 = int(sys.argv[1])
    num2 = int(sys.argv[2])
    result = num1 + num2
    print(f"{num1} + {num2} = {result}")
except ValueError:
    print("エラー: 引数は数値である必要があります。")
    sys.exit(1)

argparseを使った高度な引数解析

より複雑な引数(オプション、フラグ、サブコマンドなど)を扱う場合や、ヘルプメッセージを自動生成したい場合は、Python標準ライブラリの**argparseモジュール**が非常に強力です。プロフェッショナルなCLIツールを作成する際には必須と言えるでしょう。

1. argparseの基本的な流れ

argparseを使う基本的な手順は以下の通りです。

  1. ArgumentParserオブジェクトを作成する。

  2. add_argument()メソッドで引数を定義する。

  3. parse_args()メソッドでコマンドライン引数を解析する。

Python
 
# file_processor.py
import argparse

# 1. ArgumentParserオブジェクトを作成
parser = argparse.ArgumentParser(description="ファイルを処理するスクリプト")

# 2. 引数を定義
# 位置引数(必須)
parser.add_argument('input_file', help='処理対象の入力ファイル')

# オプション引数(任意)
parser.add_argument('--output', '-o', help='処理結果を書き込む出力ファイル (デフォルト: input_fileに.outを追加)')
parser.add_argument('--verbose', '-v', action='store_true', help='詳細な処理状況を表示')

# 3. コマンドライン引数を解析
args = parser.parse_args()

# 解析された引数にアクセス
print(f"入力ファイル: {args.input_file}")

if args.output:
    print(f"出力ファイル: {args.output}")
else:
    print(f"出力ファイル (デフォルト): {args.input_file}.out")

if args.verbose:
    print("詳細モードが有効です。")

# ここでファイルの処理を行う(省略)
print("ファイル処理を実行中...")

2. argparseの主要な機能

位置引数とオプション引数

  • 位置引数: コマンドラインで順番に指定される引数(例: python script.py <input>)。

    • parser.add_argument('引数名', ...) のようにハイフンなしで定義します。

  • オプション引数: ハイフン(-)やダブルハイフン(--)で始まる引数(例: python script.py --verbose)。

    • parser.add_argument('--オプション名', '-ショートカット', ...) のように定義します。

よく使うadd_argument()の引数

  • help: 引数の説明。これが自動的にヘルプメッセージに表示されます。

  • type: 引数の型を指定します(例: type=int, type=float)。argparseが自動で型変換を行います。

  • default: 引数が指定されなかった場合のデフォルト値。

  • action: 引数が指定された際の動作を定義します。

    • 'store_true' / 'store_false': フラグとして機能させ、引数が存在すればTrue/Falseを格納します。

    • 'count': 引数が現れた回数をカウントします(例: -vvvで3)。

  • required: Trueに設定すると、その引数が必須になります。

  • choices: 引数に指定できる値のリストを制限します。

Python
 
# advanced_args.py
import argparse

parser = argparse.ArgumentParser(description="高度な引数解析の例")

# 必須の数値引数
parser.add_argument('count', type=int, help='処理する回数')

# 任意の色指定 (選択肢を限定)
parser.add_argument('--color', choices=['red', 'blue', 'green'],
                    default='blue', help='色を指定 (red, blue, greenのいずれか)')

# フラグ引数
parser.add_argument('--debug', action='store_true', help='デバッグモードを有効にする')

args = parser.parse_args()

print(f"処理回数: {args.count}")
print(f"選択された色: {args.color}")
print(f"デバッグモード: {args.debug}")

ヘルプメッセージの自動生成

argparseの大きな利点の一つは、引数を定義するだけで自動的に詳細なヘルプメッセージを生成してくれることです。

Bash
 
python file_processor.py --help
# 出力例:
# usage: file_processor.py [-h] [--output OUTPUT] [--verbose] input_file
#
# ファイルを処理するスクリプト
#
# positional arguments:
#   input_file            処理対象の入力ファイル
#
# options:
#   -h, --help            show this help message and exit
#   --output OUTPUT, -o OUTPUT
#                         処理結果を書き込む出力ファイル (デフォルト: input_fileに.outを追加)
#   --verbose, -v         詳細な処理状況を表示

どちらを選ぶべきか?

  • sys.argv:

    • シンプルなスクリプト: 引数が1つか2つ程度で、複雑なオプションが不要な場合に最適です。

    • 学習コストが低い: Pythonのリスト操作が分かればすぐに使えます。

  • argparse:

    • 複雑なCLIツール: 多数の引数、オプション、フラグ、サブコマンドなどが必要な場合に必須です。

    • 堅牢な入力チェック: 型変換、デフォルト値、必須引数、選択肢の制限など、高度なチェック機能があります。

    • プロフェッショナルなヘルプメッセージ: 自動生成されるヘルプがユーザーにとって非常に分かりやすいです。


まとめ

Pythonでコマンドライン引数を扱う方法は、sys.argvのようなシンプルなアプローチから、argparseのような強力なモジュールまで多岐にわたります。簡単なスクリプトであればsys.argvで十分ですが、より汎用性が高く、ユーザーフレンドリーなツールを作成したい場合は、ぜひargparseの利用を検討してください。コマンドライン引数をマスターすることで、あなたのPythonスクリプトはさらに強力で柔軟なものになるでしょう。

らくらくPython塾 – 読むだけでマスター

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座