はじめに
Pythonを学習していると「モジュール」「パッケージ」「ライブラリ」という用語が頻繁に登場します。これらは似たような文脈で使われるため、混同しがちです。
この記事では、3つの用語の違いと関係性を整理し、実際の開発でどのように使い分けられているかを解説します。
この記事で分かること
- モジュール、パッケージ、ライブラリそれぞれの定義
- 3つの包含関係と違い
- 実際のインポート方法と使い分け
対象読者
- Pythonの基本文法を学習中の方
- これらの用語の違いが曖昧な方
モジュールとは
モジュールは、Pythonコードが書かれた単一の.pyファイルのことです。
定義と役割
モジュールは関数、クラス、変数などをまとめた最小単位です。コードを機能ごとに分割し、再利用可能にする役割を持ちます。
具体例
例えば、math_utils.pyというファイルを作成したとします。
# math_utils.py
def add(a, b):
return a + b
def subtract(a, b):
return a - b
PI = 3.14159
このmath_utils.pyがモジュールです。他のファイルから以下のようにインポートして使用できます。
# main.py
import math_utils
result = math_utils.add(5, 3)
print(result) # 8
print(math_utils.PI) # 3.14159
Pythonの標準ライブラリに含まれるmathやosなども、それぞれ単一のモジュールです。
パッケージとは
パッケージは、複数のモジュールをディレクトリ構造でまとめたものです。
定義と役割
関連するモジュールを階層的に整理し、名前空間を管理します。大規模なプロジェクトでコードを体系的に管理するために使われます。
ディレクトリ構造
パッケージは以下のようなディレクトリ構造を持ちます。
mypackage/
__init__.py
module1.py
module2.py
subpackage/
__init__.py
module3.py
__init__.pyの役割
__init__.pyはディレクトリをパッケージとして認識させるためのファイルです。Python 3.3以降は空でも構いませんが、パッケージの初期化処理やインポートの簡略化に使われます。
# mypackage/__init__.py
from .module1 import some_function
from .module2 import SomeClass
__all__ = ['some_function', 'SomeClass']
具体例
# mypackage/module1.py
def greet(name):
return f"Hello, {name}!"
# mypackage/module2.py
class Calculator:
def add(self, a, b):
return a + b
使用例:
# main.py
from mypackage import module1
from mypackage.module2 import Calculator
print(module1.greet("World")) # Hello, World!
calc = Calculator()
print(calc.add(3, 4)) # 7
代表的なパッケージとして、numpy、pandas、requestsなどがあります。
ライブラリとは
ライブラリは、特定の機能を提供する再利用可能なコードの集まりを指す概念的な用語です。
定義と役割
ライブラリは明確な技術的定義というよりも、一般的な呼び方です。1つのモジュールで構成される場合もあれば、複数のパッケージを含む大規模なものもあります。
モジュール・パッケージとの関係
- 小規模なライブラリ:単一のモジュールで構成されることもある
- 中規模なライブラリ:1つのパッケージで構成される
- 大規模なライブラリ:複数のパッケージやモジュールで構成される
具体例
単一モジュールのライブラリ
-
calendar:カレンダー機能を提供
パッケージ構造のライブラリ
-
requests:HTTP通信を簡単にするライブラリ -
numpy:数値計算用のライブラリ -
Django:Webフレームワーク(多数のパッケージを含む大規模ライブラリ)
import calendar
import requests
import numpy as np
いずれも「ライブラリ」と呼ばれますが、内部構造は異なります。
3つの関係性
図解で理解する
包含関係の整理
重要なポイント
- モジュールが最小単位
- パッケージはモジュールをまとめる仕組み
- ライブラリは全体を指す概念的な用語
実践的な使い分け
インポート方法の違い
モジュールのインポート
import math_utils
from math_utils import add
パッケージからのインポート
import mypackage.module1
from mypackage.module1 import greet
from mypackage import module1
ライブラリ全体を指す場合
# 「numpyライブラリを使う」と表現
import numpy as np
# 「requestsライブラリをインストール」
# pip install requests
実際の開発での使われ方
開発時の会話例:
- 「このプロジェクトではrequestsライブラリを使います」
- 「utilsというパッケージを作って共通処理をまとめよう」
- 「date_helper.pyというモジュールを追加しました」
用語の使い分けは文脈によって柔軟です。技術的には正確でなくても、コミュニケーションが成立すれば問題ありません。
まとめ
| 用語 | 定義 | 具体例 |
|---|---|---|
| モジュール | 単一の.pyファイル |
math_utils.py、os、sys
|
| パッケージ | モジュールをまとめたディレクトリ |
numpyのディレクトリ構造、myapp/utils/
|
| ライブラリ | 再利用可能なコードの集まり(概念) |
requests、pandas、Django
|
覚えておくべきポイント
- モジュールは最小単位の.pyファイル
- パッケージはモジュールを階層的に整理する仕組み
- ライブラリは全体を指す抽象的な用語
- 実際の開発では厳密に区別せず、文脈で使い分けることが多い
これらの違いを理解しておくと、Pythonのドキュメントや技術記事がより理解しやすくなります。