Pythonでスクリプトを書いていると、「実行するときに処理対象のファイル名を指定したい」「特定のオプションを付けたときだけデバッグ情報を表示したい」といった、外部から動的に値を渡したい場面が必ず出てきます。
これを実現するのが「コマンドライン引数」です。
コマンドライン引数を使えば、スクリプトのコードを直接書き換えることなく、実行時の挙動を柔軟に制御できます。
この記事では、Pythonでコマンドライン引数を扱うための2つの主要な方法、
- シンプルで手軽な
sys.argv
- 高機能で堅牢な
argparse
(推奨)
について、具体的なサンプルコードを交えながら、それぞれの使い方と特徴を徹底的に解説していきます。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
プログラミングスクール
■Webエンジニアの育成に特化 ■自社開発企業への転職成功率がダントツ ■ハイスキルを求める人に最適 |
|
■サポートは半永久的 ■単価80万円以上の講師陣 ■AWSやJavaに強い |
|
■受講料完全無料 ■最短1か月で卒業 ■教室への通学も可能 |
方法①:sys.argv を使った基本的な引数の受け取り方
まずは、Pythonの標準ライブラリsys
モジュールに含まれるargv
を使った最も基本的な方法です。
追加のライブラリをインストールする必要なく、手軽に利用できるのが特徴です。
sys.argvの仕組み
sys.argv
は、スクリプト実行時に渡されたコマンドライン引数を格納したリスト(list)です。
このリストの中身には、以下のようなルールがあります。
sys.argv[0]
: 実行したスクリプト自身のファイル名sys.argv[1]
: 1番目の引数sys.argv[2]
: 2番目の引数- …
python script.py arg1 arg2
→ sys.argv
= ['script.py', 'arg1', 'arg2']
このように、インデックス0
には必ずスクリプト名が入り、実際の引数はインデックス1
から始まることを覚えておくのが重要です。
具体的なコード例
では、実際にsys.argv
を使って引数を受け取るスクリプトを作成してみましょう。
show_args.py
import sys
print(f"sys.argvの型: {type(sys.argv)}")
print(f"sys.argvの中身: {sys.argv}")
# リストの要素数(引数の総数)を取得
num_args = len(sys.argv)
print(f"渡された引数の総数(スクリプト名を含む): {num_args}")
# 引数を一つずつ表示
if num_args > 1:
print(f"1番目の引数: {sys.argv[1]}")
if num_args > 2:
print(f"2番目の引数: {sys.argv[2]}")
実行方法と結果
このスクリプトをターミナル(Windowsの場合はコマンドプロンプト)で実行してみます。
実行コマンド
python show_args.py apple banana
実行結果
sys.argvの型: <class 'list'>
sys.argvの中身: ['show_args.py', 'apple', 'banana']
渡された引数の総数(スクリプト名を含む): 3
1番目の引数: apple
2番目の引数: banana
sys.argvの限界と注意点
手軽なsys.argv
ですが、本格的なツールを作る上ではいくつかの課題があります。
引数がすべて文字列になる | sys.argv で受け取った引数は、たとえ123 のような数字であっても、すべて文字列型(str )として扱われます。数値として計算に使いたい場合は、int() やfloat() を使って明示的に型を変換する必要があります。 |
エラーハンドリングが手動 | もし引数が期待した数より少ない場合、存在しないインデックスにアクセスしようとしてIndexError が発生します。これを避けるには、len(sys.argv) で要素数を確認するif 文を自分で書かなければなりません。 |
オプションの解析が面倒 | -f や--file のようなオプション(フラグ)を実装しようとすると、自分で引数をループさせて文字列を解析する複雑なコードが必要になります。 |
ヘルプメッセージがない | スクリプトの使い方を説明するヘルプメッセージ(-h や--help で表示されるもの)も、自力で作成する必要があります。 |
これらの課題を解決してくれるのが、次に紹介するargparse
モジュールです。
方法②:argparse を使った高機能な引数の受け取り方(推奨)
argparse
は、コマンドライン引数を解析するための、より強力で柔軟な標準ライブラリです。
少しでも複雑な引数処理が必要な場合や、他人に使ってもらう可能性があるスクリプトを作成する場合には、argparse
の利用を強く推奨します。
なぜargparseを使うべきか?
argparse
には、sys.argv
の課題を解決する多くのメリットがあります。
- ヘルプメッセージの自動生成:
-h
や--help
オプションを自動で追加し、引数の説明を分かりやすく表示してくれます。 - エラーハンドリング: 必須の引数が足りない場合などに、親切なエラーメッセージを自動で表示して終了してくれます。
- 型変換: 引数の型を
int
などに指定すれば、自動で型を変換してくれます。 - オプション引数の簡単な定義:
-f
のような短い形式と--file
のような長い形式のオプションを簡単に定義できます。 - デフォルト値: 引数が指定されなかった場合のデフォルト値を簡単に設定できます。
argparseの基本的な使い方
argparse
の利用は、以下の3つのステップで行うのが基本です。
- パーサーの作成:
argparse.ArgumentParser()
で、引数を解析するためのオブジェクトを作成します。 - 引数の定義:
.add_argument()
メソッドを使って、受け付けたい引数の名前や型、ヘルプメッセージなどを定義していきます。 - 引数の解析:
.parse_args()
メソッドを実行し、実際に渡されたコマンドライン引数を解析して、結果をオブジェクトとして取得します。
実践的なコード例
では、これらの機能を使った具体的なスクリプトを見ていきましょう。ユーザー名と年齢を受け取り、指定された回数だけ挨拶を表示するツールを作成します。
greeting_tool.py
import argparse
# 1. パーサーの作成
# descriptionは、-hで表示されるヘルプメッセージの先頭に表示される説明文
parser = argparse.ArgumentParser(description='名前と年齢を受け取り、挨拶を表示するツールです。')
# 2. 引数の定義
# 位置引数 (必須)
parser.add_argument('name', help='挨拶する相手の名前 (文字列)')
# オプション引数
parser.add_argument('-c', '--count', type=int, default=1, help='挨拶を表示する回数 (整数、デフォルト: 1)')
parser.add_argument('-a', '--age', type=int, help='相手の年齢 (整数)')
parser.add_argument('-v', '--verbose', action='store_true', help='詳細な情報を表示する')
# 3. 引数の解析
args = parser.parse_args()
# 解析した引数の利用
for i in range(args.count):
print(f"({i+1}/{args.count}) Hello, {args.name}!")
if args.age is not None:
print(f"{args.name}さんの年齢は {args.age}才です。")
if args.verbose:
print("--- 詳細情報 ---")
print(f"引数オブジェクト: {args}")
ソースコードの解説
parser.add_argument('name', ...)
⇒
name
のように-
で始まらない引数は「位置引数」となり、基本的に必須の引数として扱われます。
parser.add_argument('-c', '--count', ...)
⇒-
や--
で始まる引数は「オプション引数」となり、必須ではありません。短い形式と長い形式の両方を定義できます。
type=int
⇒count
とage
引数にint
型を指定。これにより、argparse
は渡された文字列を自動で整数に変換してくれます。もし変換に失敗するような文字列(例: abc
)が渡されると、エラーを返してくれます。
default=1
⇒count
引数が指定されなかった場合、デフォルトで1
が使われます。
action='store_true'
⇒-v
や--verbose
のような、指定されたらTrue
、されなければFalse
になるだけのフラグ(引数の値を取らないオプション)を定義する際の決まり文句です。
実行方法と結果
このスクリプトを様々な引数で実行してみましょう。
ケース1:ヘルプメッセージを表示する
python greeting_tool.py -h
実行結果
usage: greeting_tool.py [-h] [-c COUNT] [-a AGE] [-v] name
挨拶する相手のツールです。
positional arguments:
name 挨拶する相手の名前 (文字列)
options:
-h, --help show this help message and exit
-c COUNT, --count COUNT
挨拶を表示する回数 (整数、デフォルト: 1)
-a AGE, --age AGE 相手の年齢 (整数)
-v, --verbose 詳細な情報を表示する
このように、定義したhelp
メッセージが整形されて表示されます。
ケース2:必須引数とオプションを渡す
python greeting_tool.py Alice --count 3 --age 20 -v
実行結果
(1/3) Hello, Alice!
(2/3) Hello, Alice!
(3/3) Hello, Alice!
Aliceさんの年齢は 20才です。
--- 詳細情報 ---
引数オブジェクト: Namespace(name='Alice', count=3, age=20, verbose=True)
すべての引数が正しく解釈され、プログラムが動作していることが分かります。
ケース3:必須引数が足りない
python greeting_tool.py
実行結果
usage: greeting_tool.py [-h] [-c COUNT] [-a AGE] [-v] name
greeting_tool.py: error: the following arguments are required: name
必須であるname
引数が足りないため、argparse
が自動でエラーメッセージを表示してくれました。
【比較】sys.argv vs argparse どちらを使うべきか?
両者の特徴をまとめると、以下のようになります。
sys.argv |
argparse |
|
---|---|---|
手軽さ | 非常に手軽 | 少し記述量が増える |
ヘルプ機能 | なし(自作が必要) | 自動生成 |
エラー処理 | 手動(IndexError など) |
自動生成 |
型変換 | 手動(int() など) |
自動 |
オプション | 解析が複雑 | 簡単に定義可能 |
推奨度 | 個人用の単純なスクリプト | ほぼすべてのケースで推奨 |
結論として、sys.argv
が適しているケースとしては、自分しか使わない、引数が1つか2つで固定されている、といったごくごく単純なスクリプトの場合です。
argparse
が適しているケースは、上記以外のほとんどすべてのケースです。
特に、他人が使う可能性のあるツールや、少しでも複雑な引数を扱う場合は、迷わずargparse
を使いましょう。
まとめ
今回は、Pythonでコマンドライン引数を扱う2つの方法について解説しました。
なお、Pythonを体系的に学んだり、Pythonのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。