どうも、にこいちです。
for文や関数にも慣れてきて、「そろそろ“ツールっぽい”ものを作ってみたい!」——その好奇心、最高です。
そんなあなたにまず握ってほしいのが sys
モジュール。ひと言でいえば、「あなたのPythonと実行中のOSをつなぐ公式通訳」。
この記事を読み終えるころには、日々の小さな作業を“コマンド一発”で片づけるミニツールが作れるようになります。
sys
って何者? なぜ必要なの?
Pythonのプログラムは、WindowsやmacOS、LinuxといったOSの上で動く“ゲスト”。sys
は、そのゲスト(あなたのスクリプト)が 「OSの状況」や「ユーザーの指示」 を安全・正確に受け取るための正面玄関です。
- 「実行時にパラメータを渡したい」→
sys.argv
- 「途中で異常を検知して終了したい」→
sys.exit()
- 「動作中のPythonの詳細を知りたい」→
sys.version
/sys.version_info
- 「標準入力/出力で別ツールとつなぎたい」→
sys.stdin
/sys.stdout
/sys.stderr
この玄関を通るだけで、“学習用スクリプト”から“使えるツール”へ、一段ギアが上がります。
まずはこれだけ!sys
の即戦力ベスト3
1. 実行と同時に指示を受け取る:sys.argv
argv
は argument vector(引数の配列)。コマンドラインで指定した値がリストで入ります。
show_args.py
import sys
print("sys.argv ->", sys.argv) # 例: ['show_args.py', 'こんにちは', '123']
print("type(sys.argv) ->", type(sys.argv))
for i, arg in enumerate(sys.argv):
print(f"{i}番目の引数: {arg}")
実行例:
# 形式: python スクリプト名 引数1 引数2 ...
python show_args.py "こんにちは" 123
sys.argv[0]
はスクリプト名sys.argv[1]
以降に渡した引数が順に入る
活用:挨拶ツール
# hello.py
import sys
if len(sys.argv) > 1:
name = sys.argv[1]
print(f"こんにちは、{name}さん!")
else:
print("使い方: python hello.py [あなたの名前]")
💡 PowerShellの注意
ダブルクォートの扱いが異なることがあります。スペースを含む引数は"..."
で囲うのが安全。
2. その場で“きっぱり”終了する:sys.exit([code])
想定外の入力や前提欠如を検知したら、先に進まず終了するのがツールの礼儀。sys.exit()
は内部的に SystemExit
例外を送出し、終了コードをOSに返します(デフォルト0=正常)。
calc.py
import sys
if len(sys.argv) != 3:
print("使い方: python calc.py [数字1] [数字2]", file=sys.stderr)
sys.exit(2) # 2=使い方エラーなど、非0は“異常終了”の慣習
try:
num1 = int(sys.argv[1])
num2 = int(sys.argv[2])
except ValueError:
print("エラー: 数字を指定してください。", file=sys.stderr)
sys.exit(1)
print(f"{num1} + {num2} = {num1 + num2}")
✅ ベストプラクティス
- ユーザーへの通知は標準出力、エラーは
sys.stderr
- 終了コードは 0=OK / 非0=エラー(CIやシェルの分岐で使いやすい)
3. “動いているPython”を見える化:sys.version
/ sys.version_info
環境差が不具合の温床。先にバージョンを明示して不幸を防ぎましょう。
# check_version.py
import sys
print(sys.version) # 人間向けの長い文字列
print(sys.version_info) # (major, minor, micro, releaselevel, serial) のタプル
バージョン条件をチェック
import sys
if sys.version_info < (3, 8):
print("このスクリプトはPython 3.8以上が必要です。", file=sys.stderr)
sys.exit(3)
もう一歩プロっぽく:標準入出力で“つなげる”スクリプト
コマンド同士を“パイプ”でつなぐと、小さなツールの掛け算ができます。
例1:行数カウンタ(wc -l
の超軽量版)
# linecount.py
import sys
count = 0
for _ in sys.stdin: # 標準入力から読み続ける
count += 1
print(count)
実行例:
# ファイルの行数
python linecount.py < README.md
# 他コマンドと連携
cat README.md | python linecount.py
例2:フィルタ(“ERROR” を含む行だけ出力)
# grep_error.py
import sys
for line in sys.stdin:
if "ERROR" in line:
sys.stdout.write(line) # printより高速なことがある
チートシート:sys
でよく使う仲間たち
sys.platform
: 実行プラットフォーム(例'win32'
,'darwin'
,'linux'
)sys.path
: モジュール探索パス(ImportError
時に確認)sys.stdin / sys.stdout / sys.stderr
: 標準入出力(エラーはstderr
!)sys.getrecursionlimit()
/sys.setrecursionlimit(n)
: 再帰の上限sys.getsizeof(obj)
: おおまかなメモリサイズの把握sys.stdout.reconfigure(encoding="utf-8")
: Windowsの文字化け対策に有効
🔧 本格CLIに進むなら
引数が増えたらargparse
、さらに先へはclick
やtyper
が快適。まずはsys.argv
で“しくみ”を体感してからのステップアップがおすすめです。
すぐ作れる!“日常を1秒短縮”ミニツール例
温度変換(Celsius → Fahrenheit)
# c2f.py
import sys
if len(sys.argv) != 2:
print("使い方: python c2f.py [摂氏温度]")
sys.exit(2)
try:
c = float(sys.argv[1])
except ValueError:
print("数値を指定してください。", file=sys.stderr)
sys.exit(1)
f = c * 9 / 5 + 32
print(f"{c:.1f}℃ = {f:.1f}℉")
拡張:パイプ入力も受け付ける(柔軟なI/O)
# trim.py: 各行の前後空白を削って出力
import sys
for line in sys.stdin:
sys.stdout.write(line.strip() + "\n")
cat messy.txt | python trim.py > clean.txt
まとめ:sys
と仲良くなると、コードが“ツール化”する
sys.argv
… 実行時引数で操作を一発指定sys.exit(code)
… 適切な終了コードとメッセージで“親切に落ちる”sys.version
/version_info
… 先に環境差を封じるsys.stdin/out/err
… パイプで他ツールと合体、作業が一気に自動化
まずは今日、あなたの作業から1つ、「これ、毎回手でやってるな……」を sys
でツール化してみてください。
小さな成功体験が、毎日の時短と“作る楽しさ”を連れてきます。
おまけ:チェックリスト(コピペ可)
sys.argv
の個数チェックをしている- エラーは
stderr
へ出している - 終了コードは0/非0を使い分けている
- Pythonバージョンの下限を明示している
- 標準入力も受け付ける(拡張余地がある)
あなたなら、sys
でまず何を自動化しますか?
「これを一発でやりたい!」というネタ、ぜひコメントで教えてください。必要なら argparse
版への拡張もその場で作ります!
コメント