【初心者向け】Pythonのsysモジュールでコマンドライン引数を扱おう!
PythonをコマンドプロンプトやPowerShellでPC上で動かすには、Pythonをダウンロードしてインストールする必要があります。
まだの方はPythonのインストールと開発環境の構築の記事を参考にして、Pythonをインストールしてください。
「黒い画面(ターミナル)って、なんだか怖そう…」「プログラマーが使ってるイメージだけど、自分には関係ないかな?」
こんにちは!ほんの数ヶ月前まで、あなたと全く同じことを考えていた、プログラミング知識ゼロの初心者です。AIの助けを借りながら、なんとか自力で2つのWebサイト(buyonjapan.com, copicode.com)を立ち上げました。
このサイトでは、そんな私が実際につまづいたポイントや、「こうやったら上手くいった!」という感動を、初心者目線で共有しています。
今回は、Pythonの`sys.argv`を使ったコマンドライン引数の処理方法です。これが使えるようになると、まるで魔法使いのように、コマンド一つでプログラムの動きを自由自在に変えられるようになります。難しそうに聞こえますが、大丈夫!この記事のコードをコピペするだけで、「動いた!」という感動を体験できますよ。さっそく見ていきましょう!
そもそも「コマンドライン引数」って何? 🤔
本題に入る前に、少しだけ寄り道です。「コマンドライン引数」という言葉に馴染みがない方も多いと思います。
普段、私たちはマウスでアイコンをクリックしたり、ボタンを押したりしてパソコンを操作しますよね。これがGUI (グラフィカル・ユーザー・インターフェース)です。
一方、黒い画面に文字を打ち込んで命令を出すのがCUI (キャラクター・ユーザー・インターフェース)、いわゆる「コマンドライン」です。
そして、コマンドライン引数(ひきすう)とは、そのCUIでプログラムを動かすときに、「プログラム君、今回はこの設定でよろしく!」と追加で渡してあげる情報のことです。プログラムに対する「指示書」や「オプション」のようなものだと考えてください。
これを使うと、プログラムのコードを毎回書き換えなくても、実行する時々で振る舞いを変えることができて、ものすごく便利なんです!
Pythonで引数を受け取る第一歩:`sys.argv`
Pythonでコマンドライン引数を受け取る最も基本的な方法が、`sys`というモジュールに含まれる `argv` を使う方法です。
`sys`モジュールはPythonに標準で入っている(公式ドキュメント参照)ので、追加で何かをインストールする必要はありません。すぐ使えます!
まずは、受け取ったコマンドライン引数がどんな形でプログラムに渡されるのか、実際に見てみましょう。以下のコードを `show_args.py` という名前で保存してください。
<!-- show_args.py -->
import sys
print("--- プログラムに渡された引数たち ---")
print(sys.argv)
print(f"データ型は {type(sys.argv)} です。")
保存したら、ターミナル(WindowsならコマンドプロンプトやPowerShell)を開いて、このファイルがあるディレクトリに移動し、次のように実行してみてください。
# ターミナルで実行するコマンド
python show_args.py first-arg second 333
すると、こんな結果が表示されるはずです。
--- プログラムに渡された引数たち ---
['show_args.py', 'first-arg', 'second', '333']
データ型は <class 'list'> です。
結果を見ると、`sys.argv`の正体がわかりますね。そう、リスト(list)なんです!
- `sys.argv[0]`: 実行したスクリプトのファイル名 (`show_args.py`) が自動的に入ります。これはお決まりです。
- `sys.argv[1]`以降: ターミナルでスクリプト名の後ろにスペース区切りで入力した引数 (`first-arg`, `second`, `333`) が順番に格納されています。
リストなので、`sys.argv[1]`、`sys.argv[2]` のように、インデックス番号を指定すれば個々の引数を取り出すことができます。
よくあるつまづきポイントと対策 🚨
`sys.argv`はシンプルで便利な反面、初心者がハマりやすいポイントが2つあります。私も見事にハマりました…!でも、対策さえ知っていれば怖くありません。
ポイント1:引数が足りないとエラーになる (`IndexError`)
例えば、「引数を1つ受け取って、その名前で挨拶するプログラム」を作ったとします。
<!-- greet.py -->
import sys
# 最初の引数を名前として受け取る
name = sys.argv[1]
print(f"こんにちは、{name}さん!")
このプログラムを、名前を渡して正しく実行すると…
# 正しい実行例
python greet.py 鈴木
# 出力結果
# こんにちは、鈴木さん!
上手くいきますね!でも、もしうっかり引数を渡し忘れて実行したらどうなるでしょう?
# 引数を忘れた実行例
python greet.py
# 出力結果
# Traceback (most recent call last):
# File "greet.py", line 4, in <module>
# name = sys.argv[1]
# IndexError: list index out of range
`IndexError: list index out of range` というエラーが出てしまいました。これは「リストの範囲外のインデックスを指定したよ!」というエラーです。引数を渡さなかったので、`sys.argv` には `['greet.py']` しか入っていません。つまり、インデックス `1` は存在しないので、`sys.argv[1]` にアクセスしようとして怒られてしまったわけです。
【対策】プログラムの最初に、引数がちゃんと期待した数だけあるかチェックしましょう。リストの要素数は `len()` で取得できます。
<!-- greet_safe.py (安全なバージョン) -->
import sys
# sys.argvの要素数は「スクリプト名 + 引数の数」になる
# 引数が1つ欲しいので、len(sys.argv) は 2 になるはず
if len(sys.argv) != 2:
print("エラー: 名前を1つ指定してください。")
print("使い方: python greet_safe.py [あなたの名前]")
sys.exit() # プログラムをここで終了する
# この行にたどり着いたということは、引数は正しく渡されている
name = sys.argv[1]
print(f"こんにちは、{name}さん!")
ポイント2:引数はすべて「文字列」として扱われる
もう一つの重要なポイントは、`sys.argv` に入ってくる引数は、たとえ数字のように見えても、すべて文字列 (string) 型だということです。
例えば、2つの数字を引数として受け取って足し算するプログラムを考えてみましょう。
<!-- add_wrong.py (間違った例) -->
import sys
num1 = sys.argv[1] # '100' という文字列
num2 = sys.argv[2] # '50' という文字列
result = num1 + num2 # 文字列の連結が行われる
print(f"{num1} + {num2} = {result}")
これを実行すると、予想外の結果になります。
# 実行例
python add_wrong.py 100 50
# 出力結果
# 100 + 50 = 10050
`150` になるかと思いきや、`10050` になってしまいました。これは、文字列 ` '100' ` と ` '50' ` が単純に連結されてしまったためです。
【対策】計算などで数値として扱いたい場合は、`int()` や `float()` を使って、文字列を数値(整数や浮動小数点数)に型変換する必要があります。また、数字以外の文字が入力された場合に備えて、`try-except` でエラー処理をするのがお作法です。
<!-- add_correct.py (正しい例) -->
import sys
# 引数の数をチェック
if len(sys.argv) != 3:
print("エラー: 数字を2つ指定してください。")
print("使い方: python add_correct.py [数字1] [数字2]")
sys.exit()
try:
# int()で文字列を整数に変換
num1 = int(sys.argv[1])
num2 = int(sys.argv[2])
result = num1 + num2
print(f"{num1} + {num2} = {result}")
except ValueError:
# int()が変換に失敗するとValueErrorが発生する
print("エラー: 引数には半角数字を指定してください。")
【応用編】コピペで動く!引数でHTMLファイルを自動生成しよう ✨
さて、いよいよ本番です!これまで学んだことを活かして、Webクリエーターのあなたにピッタリな、実用的なプログラムを作ってみましょう。
「コマンドライン引数で『名前』と『好きな色』を受け取り、その人だけの特別な挨拶メッセージが書かれたHTMLファイルを自動で生成する」プログラムです。
以下のコードを `create_html.py` という名前で保存してください。コード全体をコピペすればOKです!
<!-- create_html.py -->
import sys
import os
# --- 1. 引数のチェック ---
# 必要な引数は「名前」と「好きな色」の2つ
if len(sys.argv) != 3:
print("[エラー] 引数の数が正しくありません。")
print("[使い方] python create_html.py [名前] [カラーコード or 色名]")
print("[例] python create_html.py 佐藤 hotpink")
sys.exit()
# --- 2. 引数を分かりやすい変数に入れる ---
user_name = sys.argv[1]
fav_color = sys.argv[2]
# --- 3. HTMLファイルに書き込む内容を生成する ---
# f-stringを使うと、文字列の中に変数を埋め込めて便利!
# HTML/CSS/JS を含む完全なコード
html_content = f"""
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{user_name}さんへの特別なメッセージ</title>
<style>
body {{
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #121212;
color: #ffffff;
}}
.card {{
padding: 40px 60px;
border-radius: 15px;
text-align: center;
border: 2px solid {fav_color};
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
background-color: #1e1e1e;
}}
h1 {{
margin: 0;
font-size: 2.5em;
/* JavaScriptで色を適用 */
}}
p {{
margin-top: 10px;
font-size: 1.2em;
color: #cccccc;
}}
</style>
</head>
<body>
<div class="card">
<h1 id="greeting">こんにちは、{user_name}さん!</h1>
<p>あなたの好きな色は <strong style="color: {fav_color};">{fav_color}</strong> ですね!</p>
</div>
<script>
// ちょっとした遊び心で、文字色をグラデーションにしてみる
const greeting = document.getElementById('greeting');
greeting.style.background = `linear-gradient(45deg, {fav_color}, #ffffff)`;
greeting.style.webkitBackgroundClip = 'text';
greeting.style.color = 'transparent';
</script>
</body>
</html>
"""
# --- 4. ファイルを書き出す ---
# ファイル名は「greet_名前.html」のようにする
file_name = f"greet_{user_name}.html"
try:
with open(file_name, "w", encoding="utf-8") as f:
f.write(html_content)
# 成功メッセージを表示
# os.path.abspath() でファイルのフルパスが取得できる
full_path = os.path.abspath(file_name)
print("🎉 HTMLファイルの生成に成功しました!")
print(f"ファイル名: {file_name}")
print(f"保存場所: {full_path}")
print("ブラウザで開いて確認してみてくださいね!")
except IOError as e:
print(f"[エラー] ファイルの書き込みに失敗しました: {e}")
sys.exit()
準備はいいですか?ターミナルで、あなたの名前と好きな色(CSSで使える色名やカラーコード)を引数にして実行してみましょう!
# 実行例(自分の名前に変えて試してください!)
python create_html.py 田中 "rgb(102, 157, 246)"
実行すると、ターミナルに成功メッセージが表示されます。
🎉 HTMLファイルの生成に成功しました!
ファイル名: greet_田中.html
保存場所: /Users/yourname/path/to/greet_田中.html
ブラウザで開いて確認してみてくださいね!
そして、同じフォルダに `greet_田中.html` のようなファイルが新しく作られているはずです。このHTMLファイルをダブルクリックしてブラウザで開いてみてください!
どうでしょう?コマンド一発で、あなたのためだけのWebページが作られました!これがコマンドライン引数の力です。ファイルのテンプレートを用意しておけば、名前や色、メッセージなどを自由に変えて、似たようなファイルを一瞬で大量生産できます。すごいと思いませんか?
まとめ:黒い画面はあなたの味方になる
今回は、Pythonの `sys.argv` を使ってコマンドライン引数を扱う方法を、私の失敗談も交えながら解説しました。
sys.argvは、引数をリストとして格納する。sys.argv[0]はスクリプト名。実際の引数は[1]から。- 引数はすべて文字列なので、必要なら
int()などで型変換する。 len()で引数の数をチェックしないとIndexErrorの元になる。- これらを組み合わせれば、定型的な作業を自動化する強力なツールが作れる!
最初はとっつきにくいコマンドラインですが、一度仲良くなってしまえば、あなたの作業を劇的に効率化してくれる最高の相棒になります。この記事が、あなたが黒い画面への一歩を踏み出すきっかけになれば、これほど嬉しいことはありません。
次のステップへ
プログラムの自動化に興味が湧いたら、次は処理のタイミングをコントロールしてみましょう。Pythonの`time`モジュールを使えば、プログラムの実行を一定時間待たせたり(スリープ)、処理にかかった時間を正確に計測したりできます。