はじめに
pythonにてcalendar
モジュールを使わずにカレンダーを作成しました。その際に、sys
モジュールについて勉強したのでまとめていきます。
sysモジュールとは
pythonに元々入っているモジュールです。sys
はsystem
の略です。
sysモジュールの役割
「Pythonインタプリタそのものを操作したり、インタプリタに渡された情報を取得できる」ということです。
pythonインタプリタとは
ターミナルにてpythonコマンドを叩くと起動します。プロンプトに
>>>
が表示されその場でコードを入力して実行できます。
pythonインタプリンタ例
# 今回はpython3で実施
python3
Python 3.13.6 (v3.13.6:4e665351082, Aug 6 2025, 11:22:35) [Clang 16.0.0 (clang-1600.0.26.6)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
# Hello Worldと出力する
>>> print("Hello World")
Hello World
sysモジュールを使えばこういったインタプリタそのものを操作したり、インタプリタに渡された情報を取得できます。
sysモジュールの準備
ファイルの一番上にこのように書くことでsysモジュールが使えるようになります。
# sysモジュールをインポート
import sys
補足ですが、import
は下記のような順番で記載します。
1.標準ライブラリ
2.サードパーティライブラリ
3.自分たちのライブラリ
4.ローカルのライブラリ
sysモジュールは、標準ライブラリなので一番上に記載します。
基本でよく使うもの
sys.argv
役割:受け取ったインタプリタをリストにする関数です
具体例
# sysモジュールをインポート
import sys
# 受け取ったインタプリタを変数colorsに格納
colors = prsys.argv
# 変数colorsの中身を確認
print(colors)
$ python3 test.py red green blue
['test.py', 'red', 'green', 'blue']
というように、sys.argv
を使うと渡した値をリストとして使うことができます。
sys.exit
役割:Pythonプログラムを強制的に終了するための関数です
具体例
import sys
print("処理開始")
sys.exit()
print("ここには到達しない")
終了コードの種類
sys.exit()
に数値を渡すと「終了コード」としてOSに返すことができる。
-
0
→ 正常終了 -
0以外
→ エラー終了
import sys
if len(sys.argv) < 2:
print("引数が足りません")
sys.exit(1) # エラー終了
print("引数OK")
sys.exit(0) # 正常終了
引数OK
sys.path
役割:Pythonがモジュールを探すときに参照するパス(ディレクトリ)の一覧を保持するリストです
print(sys.path)
# 参照するパス(ディレクトリ)の一覧がリストで格納されている
username@usernamnoMacBook-Air sysモジュール % /usr/local/bin/python3 /Users/username/Desktop/sysモジュール/sys.py
['/Users/username/Desktop/sysモジュール', '/Library/Frameworks/Python.framework/Versions/3.13/lib/python313.zip', '/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13', '/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages']
Pythonでimport モジュール名
をするとき、インタプリタはsys.path
に登録されたディレクトリを順番に探します
もし対象のモジュールがsys.path
のどこにも存在しなければ、ModuleNotFoundError
が発生します
具体例
1. カレントディレクトリで実行する場合
カレントディレクトリ(実行している場所)は自動的に
sys.path
に入っているので、その中のファイルは問題なくimport
できます
project/
├─ tools.py
└─ test.py
# インポート可能
import tools
2. sys.path に入っていない場所で実行する場合
別の場所にあるファイルは、そのままでは
import
できません
utils/
└─ tools.py
test.py
import tools # ModuleNotFoundError !!
別の場所にあるファイルからimport
する方法
sys.path
にファイルがファイルがあるディレクトリを絶対パスで追加します
sys.path
はリストなので、append
が使用できます
import sys
# モジュールがあるディレクトリを追加(絶対パス推奨)
sys.path.append("/Users/username/project/utils")
import tools # 使用可能になる
応用例(実践コード)
実装内容:calendarモジュールを使わずにカレンダーを実装
-
-m
オプションで月を指定できるようにする(今年が2025年ならpython3 calender.py -m 6
で2025年6月のカレンダーになる) - 引数を指定しない場合は、今月・今年のカレンダーが表示される
-
-m
の引数が不正な月の場合は次のエラーを出す
python3 calendar.py -m 22
22 is neither a month number (1..12) nor a name
# sysモジュールをインポート
import sys
# datetimeモジュールをインポート
import datetime as dt
# 入力した文字列をリスト化する
sys.argv
# 現在の日時を取得し、now変数に代入
now = dt.datetime.now()
# もし"-m"が入力されたらそれをindexとして指定
# その後に入力されたstringをintegerに変換して変数monthとして定義する
month = now.month
if "-m" in sys.argv:
idx = sys.argv.index("-m")
# "-m"の次に数字が入っているかを確認し、入っていなかったら現在の月をmonthとして定義する
if idx + 1 < len(sys.argv):
try:
month = int(sys.argv[idx + 1])
if month < 1 or month > 12:
raise ValueError(
f"{month} is neither a month number (1..12) nor a name"
)
except ValueError as e:
print(e)
sys.exit(1)
まとめ
まとめると下記のようになります
-
sysモジュールとは「Pythonインタプリタを操作したり、実行時の情報を取得するための標準ライブラリ」である
-
よく使うのは以下の3つ
- sys.argv : コマンドライン引数をリストとして受け取る
- sys.exit : プログラムを強制終了する
- sys.path : モジュールを探すディレクトリのリスト
インタプリタの情報を使う上で重要なモジュールということがわかりますね。