Pythonを使いこなすうえで欠かせないのが、モジュールとパッケージの概念です。
これらを理解し、標準ライブラリを活用できれば、日々のプログラミングが格段に効率的になります。
本記事では、初心者向けにモジュールとパッケージの基本から、標準ライブラリの代表的な使い方を丁寧に解説します。
モジュール(module)とは
定義
Python のソースコードを記述した単一の .py ファイルのこと。
役割
関数・クラス・定数などをまとめておき、他のスクリプトから読み込んで再利用できる。
使い方
# ファイル名:mymodule.py
def hello():
print("こんにちは、モジュール!")
# 別のスクリプトから
import mymodule
mymodule.hello() # → こんにちは、モジュール!
パッケージ(package)とは
定義
複数のモジュールをまとめたディレクトリ(フォルダ)のこと。
構造
パッケージには必ず __init__.py という空または初期化用のファイルを置く(Python 3.3以降は省略可ですが、慣習的に置くことが多い)
役割
機能ごとにサブディレクトリを切ってファイルを整理し、大規模なプロジェクトで見通しをよくする。
使い方
mypackage/
├── __init__.py
├── mod_a.py
└── subpkg/
├── __init__.py
└── mod_b.py
# mypackage/mod_a.py に定義
def foo(): print("foo in mod_a")
# mypackage/subpkg/mod_b.py に定義
def bar(): print("bar in mod_b")
# パッケージの利用例
from mypackage import mod_a
from mypackage.subpkg.mod_b import bar
mod_a.foo() # → foo in mod_a
bar() # → bar in mod_b
ライブラリ(library)とは
定義
モジュールやパッケージを集めて、ある分野の機能をまとめたもの。
標準ライブラリのPython 標準で付属しているライブラリ群(例:os、sys、datetime、mathなど)やサードパーティライブラリの外部が提供する追加インストール型のライブラリ(例:requests、NumPy、Pandasなど)があります。
使い方
標準ライブラリはインストール不要でそのまま import できます。
サードパーティライブラリは「pip install ライブラリ名」で導入してから import する。
pip install requests
import requests
res = requests.get("https://example.com")
print(res.status_code)
import モジュール名 の書き方・特徴
import モジュール名
機能
指定したモジュール全体を読み込みます。
呼び出し方
モジュール名をプレフィックス(接頭辞)として、モジュール内の関数やクラス、変数にアクセスします。
メリット
- 名前の衝突を防ぎやすい(どのモジュール由来か一目でわかる)。
- モジュール全体をまとめて管理できる。
デメリット
毎回モジュール名を付ける必要があるため、長いモジュール名だと冗長になる場合がある。
例:mathモジュール全体をインポート
import math
print(math.pi) # → 3.141592653589793
print(math.sqrt(16)) # → 4.0
別名をつける(エイリアス)
長いモジュール名を短くしたい場合は、as で別名を付けられます。
import numpy as np
arr = np.array([1, 2, 3])
print(arr) # → [1 2 3]
from モジュール名 import 名前 の書き方・特徴
from モジュール名 import 名前1, 名前2, …
機能
指定したモジュールから、必要な関数やクラス、変数だけを読み込みます。
呼び出し方
名前
を直接使えます(モジュール名のプレフィックス不要)。
メリット
- 呼び出しがシンプル(モジュール名を付ける必要がない)。
- 読み込む対象が明確なので、コードを見ただけで使っている機能がわかりやすい。
デメリット
- 多数の名前をインポートすると、管理が煩雑になる可能性がある。
- 名前が衝突しやすい(同名の関数を別モジュールからimportすると上書きされる)。
例:datetimeモジュールからdateだけをインポート
from datetime import date
today = date.today()
print(today) # → 2025-04-29 など
複数の名前を同時に指定することもできます。
from os import path, mkdir
if not path.exists('data'):
mkdir('data')
別名をつける場合
関数やクラス自体にも as で別名を付けられます。
from math import sqrt as msqrt
print(msqrt(25)) # → 5.0
ワイルドカードインポート(非推奨)
モジュール内のすべての名前を読み込みます。
推奨されない書き方なので、必要な名前だけを明示的に import しましょう。
from モジュール名 import *
注意点
- どの名前を使っているのか分かりにくくなる。
- 名前衝突のリスクが高い。
相対インポート(パッケージ内でのモジュール読み込み)
同じパッケージ内での呼び出しには「from .」「from ..」を使える。
my_package/
├── __init__.py
├── module_a.py # def func_a(): ...
└── subpkg/
├── __init__.py
└── module_b.py # def func_b(): ...
# module_b.py 内
from ..module_a import func_a # 一つ上の階層の module_a から
from .module_c import func_c # 同じサブパッケージ内 module_c から
動的インポート(ランタイムにモジュール名が決まる場合)
Python標準の importlib を使って文字列から読み込むこともできます。
import importlib
module_name = "math"
math_mod = importlib.import_module(module_name)
print(math_mod.pi) # → 3.141592653589793
プロジェクトの規模や用途に合わせて使い分けることで、可読性と保守性の高いコードを書くことができます。ぜひ試してみてください!