
「main関数のargsって、一体何のためにあるの?」
「プログラムを実行するたびに、コードを書き換えるのが面倒…」
プログラミングの学習が進んでくると、単にプログラムを実行するだけでなく、「実行するときに、外部から情報を与えて、プログラムの動きを柔軟に変えたい」という場面が出てきます。
例えば、
-
処理対象のファイル名を、実行時に指定したい。
-
計算する数値を、実行のたびに変えたい。
-
特定のオプション(例:-vで詳細表示モード)を付けたい。
そんな時に、非常に強力な武器となるのが**「コマンドライン引数(ひきすう)」**です。
この記事では、プログラミング初心者の方が、この「コマンドライン引数」という、少し玄人っぽくてカッコいいテクニックをマスターできるように、わかりやすくステップ・バイ・ステップで解説していきます。
-
コマンドライン引数の基本的な考え方
-
Python (sys.argv) での、具体的な受け取り方と使い方
-
Java (String[] args) での、具体的な受け取り方と使い方
-
コマンドライン引数を使うことの、絶大なメリット
コマンドライン引数とは?「レストランの注文」に例えると一目瞭然
まず、コマンドライン引数とは、その名の通り**「コマンドライン(ターミナルやコマンドプロンプト)から、プログラムを起動する際に、プログラムに対して渡す、追加の情報(引数)」**のことです。
この関係は、レストランでの注文に例えると、非常にわかりやすいです。
あなたがレストラン(=プログラム)に行くとき、ただ「料理をください」とだけ言っても、シェフ(=プログラム)は何を作ればいいかわかりませんよね。
-
プログラムを起動するコマンド:「シェフ、お願いします!」と厨房に声をかける行為。
-
例:python cook.py
-
-
コマンドライン引数:具体的な**「注文内容」**。
-
例:ハンバーグ ウェルダンで ソースはデミグラス
-
これらを組み合わせると、python cook.py ハンバーグ ウェルダンで ソースはデミグラスという、一つの完全な「命令」になります。
厨房のシェフ(cook.py)は、この注文内容(コマンドライン引数)を受け取り、「なるほど、ハンバーグをウェルダンで、デミグラスソースで焼けばいいんだな」と理解し、その通りに調理を始めることができます。
もし、次の日にあなたが「チキンソテーを、皮はパリパリで、ソースは和風で」と注文(引数を変更)すれば、シェフは、プログラム(レシピ)を一切変更することなく、全く違う料理を提供してくれます。
これが、コマンドライン引数の本質です。
Pythonでの使い方:sys.argvを使いこなそう!
Pythonでは、標準ライブラリである**sysモジュール**を使うことで、コマンドライン引数を簡単に受け取ることができます。
コマンドライン引数は、**sys.argv**という、リスト(配列)に格納されています。
基本的な受け取り方
まずは、引数がどのように格納されるかを見てみましょう。以下の内容で、args_test.pyというファイルを作成してください。
import sys # sysモジュールをインポート
print(f"受け取った引数の数: {len(sys.argv)}")
print(f"引数のリスト: {sys.argv}")
print("--- 引数を一つずつ表示 ---")
for i, arg in enumerate(sys.argv):
print(f"sys.argv[{i}]: {arg}")
このプログラムを、ターミナルで、いくつかの異なる引数を付けて実行してみましょう。
実行例1:引数なし
$ python args_test.py
受け取った引数の数: 1
引数のリスト: ['args_test.py']
--- 引数を一つずつ表示 ---
sys.argv[0]: args_test.py
実行例2:引数2つ
$ python args_test.py hello world
受け取った引数の数: 3
引数のリスト: ['args_test.py', 'hello', 'world']
--- 引数を一つずつ表示 ---
sys.argv[0]: args_test.py
sys.argv[1]: hello
sys.argv[2]: world
【重要なポイント】
-
sys.argvは、スペース区切りで引数をリストに格納します。
-
sys.argvの0番目 (sys.argv[0]) には、必ず実行したスクリプトファイル名自身が入ります。
-
実際に私たちが渡した引数は、1番目 (sys.argv[1]) 以降に格納されます。
実践的な例:ファイル名を引数で受け取る
コマンドライン引数が最もよく使われるのが、「処理対象のファイル名を指定する」というケースです。
import sys
# 引数の数をチェック
# スクリプト名とファイル名の2つが渡されるはず
if len(sys.argv) != 2:
print("エラー: ファイル名を一つ指定してください。")
print("例: python read_file.py sample.txt")
sys.exit(1) # プログラムを異常終了
# 2番目の引数(インデックスは1)をファイル名として取得
file_path = sys.argv[1]
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
print(f"--- {file_path} の内容 ---")
print(content)
except FileNotFoundError:
print(f"エラー: ファイル '{file_path}' が見つかりません。")
sys.exit(1)
このプログラムを実行するには、まず、同じディレクトリにsample.txtというテキストファイルを用意しておく必要があります。
実行
$ python read_file.py sample.txt
--- sample.txt の内容 ---
これはサンプルファイルです。
コマンドライン引数のテスト。
sample.txtの部分を、別のファイル名に変えれば、コードを一切書き換えることなく、様々なファイルの内容を表示できます。非常に便利ですよね。
「プログラミングを始めてみたいけど、どの言語から手をつければいいの?」「Pythonが人気らしいけど、どうやって勉強すればいいんだろう?」 もしあなたがそう思っているなら、素晴らしい選択です! Pythonは、今最も人気が[…]
Javaでの使い方:mainメソッドのString[] args
Javaでは、もっとシンプルです。プログラムのエントリーポイント(入口)であるmainメソッドの引数として、最初から用意されています。
public static void main(String[] args)
この、String[] args こそが、コマンドライン引数を格納するための、文字列の配列(StringのArray)なのです。
基本的な受け取り方
public class ArgsTest {
public static void main(String[] args) {
System.out.println("受け取った引数の数: " + args.length);
System.out.println("--- 引数を一つずつ表示 ---");
for (int i = 0; i < args.length; i++) {
System.out.println("args[" + i + "]: " + args[i]);
}
}
}
【Javaのコンパイルと実行】
-
コンパイル(ソースコードを、実行可能なファイルに変換)
$ javac ArgsTest.java
-
行(引数を付けて)
$ java ArgsTest hello world from java 受け取った引数の数: 4 --- 引数を一つずつ表示 --- args[0]: hello args[1]: world args[2]: from args[3]: java
【Pythonとの重要な違い】
-
Javaのargs配列には、Pythonのsys.argv[0]のような、実行したクラス名(ファイル名)は含まれません。
-
args[0]の最初から、私たちが渡した引数が格納されます。
実践的な例:2つの数値を引数で受け取り、計算する
public class Calculator {
public static void main(String[] args) {
// 引数が2つでない場合は、エラーメッセージを表示して終了
if (args.length != 2) {
System.out.println("エラー: 数値を2つ指定してください。");
System.out.println("例: java Calculator 10 20");
return; // メソッドを抜ける
}
try {
// 文字列として受け取った引数を、整数(int)に変換
int num1 = Integer.parseInt(args[0]);
int num2 = Integer.parseInt(args[1]);
int sum = num1 + num2;
System.out.println("合計: " + sum);
} catch (NumberFormatException e) {
System.out.println("エラー: 引数には数値を指定してください。");
}
}
}
実行
$ javac Calculator.java
$ java Calculator 10 20
合計: 30
$ java Calculator 100 50
合計: 150
このように、実行のたびに、異なる数値で計算ができる、柔軟な電卓ツールが完成しました。
「プログラミングを始めたいけど、どの言語がいいんだろう?」「Javaは求人が多いって聞くけど、なんだか難しそう…」 そんなふうに思っているプログラミング初心者の方へ。Javaは、確かに学ぶべきことが多い言語です[…]
コマンドライン引数を使うことの絶大なメリット
-
再利用性の向上
処理するデータや設定を、コードの内部に直接書き込む(ハードコーディングする)のではなく、外部から引数として与えることで、そのプログラムは、様々な状況に対応できる、再利用性の高い「ツール」になります。 -
自動化との親和性
コマンドライン引数を使えば、プログラムの実行を、シェルスクリプトなどから簡単に自動化できます。例えば、「毎日深夜に、log_20231027.txtというファイルを引数にして、この集計プログラムを実行する」といった、自動処理を簡単に組むことができます。 -
開発効率の向上
動作確認のたびに、いちいちソースコードを書き換えて、コンパイルし直す…といった手間がなくなります。ターミナルで、↑キーを押して、引数だけを変えて再実行する方が、はるかに高速です。
まとめ
コマンドライン引数は、一見すると地味で、初心者には少し縁遠いテクニックに思えるかもしれません。
しかし、その本質は、プログラムと、それを使う人間(や、他のプログラム)との間の、最も基本的で、最もパワフルな「対話」の方法です。
-
プログラムを実行するときに、外部から情報を与える仕組み。
-
Pythonではsys.argv、Javaではmainメソッドのargsで受け取る。
-
コードを書き換えずに、プログラムの振る舞いを柔軟に変えられる。
あなたがこれから、単にプログラミングを「学ぶ」段階から、誰かの問題を解決するための、便利な「ツールを作る」段階へとステップアップしていくとき、このコマンドライン引数の知識は、必ずやあなたの強力な武器となるでしょう。
まずは、この記事のサンプルコードを真似して、あなたの手で、実行時に「こんにちは、〇〇さん!」と、引数で与えた名前に挨拶してくれるプログラムを作ってみることから、始めてみませんか?
「プログラミングを学んで、自由な働き方を手に入れたい」「将来性のあるスキルを身につけて、キャリアアップしたい」「自分のアイデアを形にするサービスを作ってみたい」 そんな希望を胸に、プログラミング学習を始めようとしているあなたへ[…]