PythonとOSの“ひそひそ話”を盗み聞き!import sysであなたのスクリプトを一気にプロ化しよう

PR表記

※アフィリエイト広告を利用しています

どうも、にこいちです。
for文や関数にも慣れてきて、「そろそろ“ツールっぽい”ものを作ってみたい!」——その好奇心、最高です。
そんなあなたにまず握ってほしいのが sysモジュール。ひと言でいえば、「あなたのPythonと実行中のOSをつなぐ公式通訳」
この記事を読み終えるころには、日々の小さな作業を“コマンド一発”で片づけるミニツールが作れるようになります。

Web食いオンラインスクール公式サイトはこちら

目次

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

argvargument 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、さらに先へは clicktyper が快適。まずは 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 版への拡張もその場で作ります!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次