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
プロジェクトの規模や用途に合わせて使い分けることで、可読性と保守性の高いコードを書くことができます。ぜひ試してみてください!
