Pythonスクリプトを実行する際、プログラムの中で固定された値を使うのではなく、実行時に外部から値を渡したい場合があります。これを「コマンドライン引数」と呼びます。
例えば、python script.py data.txt のようにファイル名を指定したり、処理モードを切り替えたりする場合に使用されます。
この記事では、標準ライブラリの sys モジュールを使用して、コマンドライン引数を取得する基本的な方法について解説します。
コマンドライン引数とは
ターミナル(コマンドプロンプト)からPythonを実行する際、ファイル名の後ろにスペース区切りで記述した文字列が、プログラムに「引数」として渡されます。
python my_script.py arg1 arg2
この例では、arg1 と arg2 が引数となります。
sys.argv の仕組み
Pythonでこれを受け取るには、sys モジュールの argv という変数を使用します。 sys.argv は、コマンドラインで入力された内容を文字列のリストとして保持しています。
重要なルールとして、リストの要素は以下のように格納されます。
- インデックス 0 (
sys.argv[0]): 実行したスクリプトファイル名(例:my_script.py) - インデックス 1 (
sys.argv[1]): 最初の引数 - インデックス 2 (
sys.argv[2]): 2番目の引数 - …以降同様
実践的なコード例:挨拶ツール
具体的な例として、「名前」と「回数」という2つの引数を受け取り、指定された回数だけ挨拶を表示するツール greet_tool.py を作成します。
サンプルコード
import sys
def main():
# sys.argv の内容を確認(デバッグ用)
# 実際にはコメントアウトするか削除して使用します
# print(f"受け取った引数リスト: {sys.argv}")
# 引数の数をチェック
# スクリプト名(1) + 名前(1) + 回数(1) = 合計3つ必要
if len(sys.argv) < 3:
print("エラー: 引数が足りません。")
print("使用法: python greet_tool.py [名前] [回数]")
return
# 引数の取得
# sys.argv[0] は "greet_tool.py" なので、[1] から取得する
target_name = sys.argv[1]
repeat_count_str = sys.argv[2]
# 引数はすべて「文字列」として渡されるため、数値が必要な場合は変換する
try:
repeat_count = int(repeat_count_str)
except ValueError:
print("エラー: [回数] には整数を指定してください。")
return
# メイン処理の実行
print(f"--- {target_name} さんへの挨拶を開始します ---")
for i in range(repeat_count):
print(f"{i + 1}: こんにちは、{target_name} さん!")
if __name__ == "__main__":
main()
実行方法と結果
ターミナルを開き、保存したディレクトリで以下のコマンドを実行します。
正常な実行:
python greet_tool.py Tanaka 3
実行結果:
--- Tanaka さんへの挨拶を開始します ---
1: こんにちは、Tanaka さん!
2: こんにちは、Tanaka さん!
3: こんにちは、Tanaka さん!
引数が足りない場合:
python greet_tool.py Tanaka
実行結果:
エラー: 引数が足りません。
使用法: python greet_tool.py [名前] [回数]
実装時の注意点
1. インデックスのズレに注意する
前述の通り、sys.argv[0] にはスクリプト名そのものが入っています。ユーザーが指定した最初の値は sys.argv[1] から始まります。これを取り違えると意図しない挙動になります。
2. 型変換を行う
コマンドライン引数は、数字を入力してもすべて**文字列(str)**としてプログラムに渡されます。 計算やループ回数に使用する場合は、必ず int() や float() などで適切な型に変換する必要があります。
3. エラーハンドリング(IndexError)
引数が指定されずに実行された場合、存在しないインデックス(例: sys.argv[1])にアクセスしようとすると IndexError が発生します。 必ず len(sys.argv) でリストの長さを確認してから要素にアクセスするように記述します。
まとめ
- コマンドライン引数を取得するには
import sysを行い、sys.argvを参照します。 sys.argvはリストであり、sys.argv[0]はスクリプトファイル名です。- 引数はすべて文字列として渡されるため、必要に応じて型変換を行います。
- 引数の不足によるエラーを防ぐため、
len(sys.argv)で長さをチェックします。
なお、より複雑な引数(オプション指定 -h や --verbose など)を扱いたい場合は、標準ライブラリの argparse モジュールの使用が推奨されますが、単純な値の受け渡しであれば sys.argv が最も手軽な方法です。
