Pythonでスクリプトを作成する際、プログラムの動作環境や標準入出力を制御したい場面が多々あります。そんなときに活躍するのが標準ライブラリのsysモジュールです。
本記事では初級者向けにsysモジュールの基本機能をわかりやすく解説し、最後に演習問題とその解答例を掲載します。
これを読めば、コマンドライン引数の扱い方から例外的終了処理、モジュール探索パスの確認まで、一通りの使い方を習得できます。
sysモジュールとは
sysは「system(システム)」の略で、Pythonインタープリタ自体に関する情報や機能を提供するモジュールです。
インポートは非常に簡単で、どのスクリプトでも以下の一行を追加するだけです。
import sys
これでsys.argvやsys.exit()など、多彩な機能が利用可能になります。
コマンドライン引数:sys.argv
スクリプトにコマンドラインから引数を渡す場合、sys.argvを使います。
sys.argvは文字列のリストで、先頭要素sys.argv[0]にスクリプト名が入り、続く要素に実行時引数が格納されます。
$ python script.py Alice 25
import sys
if len(sys.argv) != 3:
print("使い方: python script.py 名前 年齢")
sys.exit(1)
name = sys.argv[1]
age = sys.argv[2]
print(f"こんにちは、{name}さん。{age}歳ですね!")
引数が足りないときはsys.exit(1)で異常終了させるのが一般的です。
プログラムの終了:sys.exit()
sys.exit()を呼び出すと、プログラムを終了し、OSに終了コード(整数)を返します。デフォルトは0(正常終了)です。
import sys
if not 条件:
sys.exit("エラーメッセージを表示して終了")
メッセージ文字列を渡すと標準エラー出力にメッセージが表示されます。
テストスクリプトやバッチ処理で異常時にsys.exit(1)など非ゼロコードを返すと自動化が容易になります。
モジュール探索パス:sys.path
Pythonがimport時にモジュールを探すパスはsys.pathにリスト形式で保持されています。
必要に応じて動的にパスを追加することで、プロジェクト外のディレクトリを参照できます。
import sys
print(sys.path) # パスの一覧を表示
# カレントディレクトリの../libsを追加
sys.path.append("../libs")
仮想環境やDockerコンテナでのパス設定、長いプロジェクト構成の管理に役立ちます。
Pythonバージョンやプラットフォーム情報
- sys.version: インタープリタのバージョン情報を文字列で取得
- sys.platform: 実行環境のプラットフォーム(例: “linux”, “darwin”, “win32″)を識別
import sys
print("Python バージョン:", sys.version)
print("プラットフォーム:", sys.platform)
これらを条件分岐に使えば、Windows専用機能の呼び出しや、古いバージョンでの動作回避が可能です。
標準入出力の制御
- sys.stdout: 標準出力のファイルオブジェクト
- sys.stderr: 標準エラー出力のファイルオブジェクト
- sys.stdin: 標準入力のファイルオブジェクト
たとえばログをすべてファイルに書きたいときは、sys.stdoutを差し替えれば簡単に実装できます。
import sys
with open("log.txt", "w") as f:
sys.stdout = f
print("このメッセージは log.txt に書き込まれます")
読み込まれたモジュール一覧:sys.modules
sys.modulesは現在読み込まれている全モジュールをキー:モジュールオブジェクトの辞書で保持しています。動的なリロード制御や重複インポートの確認に利用可能です。
import sys, json
print("jsonモジュールは読み込まれている?", "json" in sys.modules)
まとめ
sysモジュールはPythonの根幹部分にアクセスできる強力なツールです。
- コマンドライン引数の取得:sys.argv
- プログラム終了:sys.exit()
- モジュール探索パス:sys.path
- バージョン・プラットフォーム:sys.version, sys.platform
- 標準入出力制御:sys.stdin, sys.stdout, sys.stderr
- 読み込み済みモジュール:sys.modules
これらを使いこなせば、スクリプトやアプリケーションの汎用性・安定性が格段に向上します。
演習問題
- コマンドライン引数を使った計算プログラム
引数に2つの整数を受け取り、その和と積を出力するスクリプトを作成してください。引数が足りない場合はエラーメッセージを表示して異常終了してください。 - 標準入出力のリダイレクト
sys.stdoutを利用し、print()の出力をすべてファイルoutput.txtに書き込むプログラムを作成してください。 - プラットフォーム判定
sys.platformを用いて、Windows系かUnix系(Linux/Mac)かを判定し、それぞれで異なるメッセージを表示するプログラムを作成してください。 - モジュール探索パスの動的追加
スクリプト起動時にカレントディレクトリのサブフォルダmodulesをsys.pathに追加し、その中の自作モジュールmymodule.pyをインポートして関数を実行する例を示してください。 - 読み込み済みモジュール一覧の表示
sys.modulesを使い、現在読み込まれているモジュール名をアルファベット順に並べ替えて一覧表示するプログラムを作成してください。
解答例
1. 計算プログラム
# sum_mul.py
import sys
if len(sys.argv) != 3:
print("使い方: python sum_mul.py 数値1 数値2", file=sys.stderr)
sys.exit(1)
try:
a = int(sys.argv[1])
b = int(sys.argv[2])
except ValueError:
print("整数を指定してください", file=sys.stderr)
sys.exit(1)
print(f"{a} + {b} = {a + b}")
print(f"{a} * {b} = {a * b}")
2. 出力リダイレクト
# redirect.py
import sys
with open("output.txt", "w") as f:
sys.stdout = f
print("このメッセージはoutput.txtに書き込まれます")
# プログラム終了後にoutput.txtを開くと内容を確認できます
3. プラットフォーム判定
# platform_check.py
import sys
if sys.platform.startswith("win"):
print("Windows系 OS です")
else:
print("Unix系 OS です(Linux/Mac 等)")
4. モジュール探索パス追加
# use_mymodule.py
import sys
sys.path.append("./modules")
import mymodule # modules/mymodule.py を想定
mymodule.hello() # 例: 関数 hello() を実装している
modules/mymodule.py
def hello():
print("mymoduleからの挨拶!")
5. モジュール一覧表示
# list_modules.py
import sys
modules = sorted(sys.modules.keys())
for name in modules:
print(name)
これらの演習を通じて、sysモジュールの主要機能を実際に手を動かして学びましょう!