sysモジュール | 標準モジュールの活用 | Python本格超入門

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
ad. 価格範囲を指定して商品を探せます

sysモジュール

Pythonの sys モジュールは、Pythonインタプリタ(プログラムを実行する仕組みそのもの)や、それが動作しているシステム環境(OSなど)と直接やり取りするための機能を提供する標準モジュールです。

このモジュールを活用することで、プログラムを実行する際の外からの指示(コマンドライン引数)を受け取ったり、プログラムを途中で安全に強制終了させたりといった、システム密着型の高度な制御が可能になります。

基本的な使い方

sys モジュールはPythonの標準ライブラリに含まれているため、追加のインストール作業(pip など)は不要です。以下のようにインポートするだけで、すぐに使い始めることができます。

import sys

コマンドライン引数の取得(sys.argv)

実務で作成するプログラムでは、実行時に外部からデータや設定(ファイル名、処理モードなど)を引き渡したいケースが多々あります。その際に使われるのが sys.argv です。

sys.argv は、コマンドラインから入力された値が格納されるリスト(配列)です。ここで最も重要な注意点は、「リストの最初の要素(sys.argv[0])には、実行したスクリプト自身のファイル名が自動的に入る」という特性です。

import sys

# 渡されたすべての引数をリストとして表示
print(f"引数のリスト: {sys.argv}")

# 2番目の要素からが、実際にユーザーが指定した引数になります
if len(sys.argv) > 1:
    print(f"最初の実際の引数: {sys.argv[1]}")

例えば、ターミナルで python script.py data.csv 100 と実行した場合、sys.argv の中身は以下のようになります。

  • sys.argv[0]'script.py'(スクリプト名)
  • sys.argv[1]'data.csv'(第1引数)
  • sys.argv[2]'100'(第2引数 ※文字列として受け取る点に注意)

実行中のPythonバージョンの取得(sys.version)

特定のバージョンでしか動かない新機能(例:Python 3.10以降の match-case 文など)を使用する場合、プログラムの冒頭で実行環境のバージョンを確認し、条件を満たしていない場合に警告を出すような仕組みを作ることができます。

import sys

# Pythonの詳細なバージョン情報を文字列で取得
print(f"Pythonのバージョン: {sys.version}")

# バージョンを数値のタプル(主要、マイナー、マイクロ)で比較したい場合はこちらが便利です
print(f"バージョン詳細(タプル): {sys.version_info}")
if sys.version_info < (3, 10):
    print("警告: このプログラムはPython 3.10以降を推奨します。")

標準出力・標準エラーのリダイレクト

通常、print() 関数で出力した文字列は画面(コンソール)に表示されます。これは、内部的に sys.stdout(標準出力)という行き先が指定されているためです。

この sys.stdout の向き先をファイルオブジェクトに書き換えることで、プログラム内のすべての print() の出力結果を画面ではなく、ログファイルへと自動的にリダイレクト(保存)させることができます。

import sys

# 本来の出力先(コンソール)を一時的に退避
original_stdout = sys.stdout

# 出力先をファイルに切り替える
with open('output.txt', 'w', encoding='utf-8') as f:
    sys.stdout = f
    print("この文字は画面ではなく、自動的にファイルへと書き込まれます。")
    print("ログの記録などに非常に便利です。")

# 処理が終わったら元のコンソール出力に戻す
sys.stdout = original_stdout
print("画面出力に戻りました。")

sysモジュールの主要な機能一覧

sys モジュールでよく使われる、実務上重要な属性や関数をまとめました。

属性 / 関数 具体的な用途と特徴
sys.path import 文がモジュールを探しにいくフォルダ(ディレクトリ)のパスが格納されたリスト。ここにパスを append() することで、一時的に検索場所を追加できます。
sys.exit() プログラムをその場で強制終了します。引数に 0 を渡すと「正常終了」、1 以上の数値を渡すと「異常終了(エラー)」をシステムへ通知します。
sys.platform 実行しているOSの種類を識別します(Windowsなら 'win32'、Macなら 'darwin'、Linuxなら 'linux' を返します)。
sys.getsizeof() 指定したPythonオブジェクト(変数、リストなど)が、メモリ上で実際に何バイトの容量を消費しているかを正確に返します。

実践:sys.exit() によるエラーハンドリングと終了ステータス

以下は、コマンドライン引数の数をチェックし、必要な情報が不足している場合に適切な「終了ステータス(終了コード)」をシステムに返して安全に離脱する、実務的なプログラムの組み立て方です。

import sys

# 引数が足りない(スクリプト名を含めて2未満)場合の防衛策
if len(sys.argv) < 2:
    print("エラー: 処理対象のファイル名を引数に指定してください。", file=sys.stderr)
    print("使用例: python main.py data.csv")
    # 終了コード 1(異常終了)を返してプログラムを即座に終了
    sys.exit(1)

# 引数が正常に渡されている場合のみ、以降のメイン処理が実行される
target_file = sys.argv[1]
print(f"「{target_file}」の解析処理を開始します...")

sys.exit() を実行すると内部で SystemExit という特殊な例外が発生し、with 構文のクローズ処理などを安全に通しながら綺麗にプログラムを終わらせることができます。

まとめ

Pythonにおける sys モジュールの重要ポイントは以下の通りです。

  • Pythonの心臓部と繋がるモジュール:インタプリタの内部設定や、実行環境そのものの情報にアクセスするための強力な道具です。
  • sys.argv で外の世界と連携sys.argv[0] がスクリプト名、sys.argv[1] 以降が実際の引数になるルールを正確に把握しておきましょう。
  • sys.exit() による安全な離脱:エラー発生時にプログラムをダラダラと続けず、終了コード(0以外の数値)を伴ってスマートに終了させるのが、バッチ処理や自動化スクリプトにおける鉄則です。

sys モジュールを使いこなせるようになると、手元のパソコンで完結する簡易的なスクリプトから、サーバー上で他のシステムやシェルスクリプトと緊密に連携する「本物のシステムツール」へとステップアップすることができます。