はじめに
Python を使って開発していると、必ず登場するのが モジュール(module) と パッケージ(package) です。
「import ってどう動くの?」「自作モジュールってどう作るの?」という疑問に、この記事でまとめて答えます。
Python のコードが“整然とした街”のように構造化される仕組みを、実例ベースで解説します。
1. モジュール(module)とは?
結論から言うと:
1つの
.pyファイルが 1つのモジュール
たとえば:
greet.py
math_tools.py
poyo.py
これら全部モジュールです。
◎ モジュールを import する方法
import greet
greet.hello("Anna")
「名前を呼べば出てくる」それが import。
2. パッケージ(package)とは?
パッケージ = モジュールが集まったフォルダ
そのフォルダに__init__.pyが入っていることが必須。
例:
mypackage/
__init__.py
utils.py
chess/
__init__.py
board.py
__init__.py は「ここはパッケージですよ」という“表札”です。
3. import の基本とバリエーション
Python の import は柔軟で、主に次の4パターン。
3.1 モジュールそのものを import
import utils
utils.do_something()
最も基本的で安全。
3.2 モジュールから特定の関数・クラスを import
from utils import do_something
do_something()
よく使われるが、名前衝突には注意。
3.3 as で別名をつける
import numpy as np
実務で非常に多いスタイル。
3.4 パッケージ内のモジュールを import
from mypackage.chess import board
さらに深く:
from mypackage.chess.board import print_board
4. 自作モジュールを作る
-
greet.pyを作成 - 中身を書く
def hello(name):
print(f"こんにちは、{name}さん!")
別ファイルで呼ぶ
import greet
greet.hello("Anna")
完成。簡単すぎてびっくりするレベル。
5. 自作パッケージを作る
例として chessutils というパッケージを作ります。
chessutils/
__init__.py
move.py
board.py
move.py
def legal_moves(piece):
return ["a3", "a4"]
board.py
def print_board():
print("8 × 8 Chess Board")
使用側
from chessutils.board import print_board
from chessutils.move import legal_moves
print_board()
print(legal_moves("pawn"))
6. モジュール検索パス(import の裏側)
Python は import するとき、この順序で探します:
- カレントディレクトリ
- PYTHONPATH
- site-packages(ライブラリ)
確認するには:
import sys
print(sys.path)
もし「import できない」場合は、ほぼこれが原因。
7. 相対 import(パッケージ内部での呼び出し)
同じパッケージ内で他モジュールを呼ぶ方法。
mypkg/
a.py
b.py
b.py から a.py を呼びたい:
from .a import func_a
. → カレントパッケージ
.. → 1階層上のパッケージ
8. よくある import の落とし穴
| 落とし穴 | 内容 |
|---|---|
| モジュール名を標準ライブラリと同名にする |
random.py を作る→標準 random が壊れる |
パッケージ内に __init__.py がない |
Python がパッケージと認識しない |
| sys.path をむやみに書き換える | 一時的には便利だがプロジェクトが壊れやすい |
| 相対 import の混乱 | 単体実行できず、必ず “パッケージとして実行” が必要 |
9. おすすめのプロジェクト構成(実務向け)
project/
app/
__init__.py
router.py
service.py
core/
__init__.py
config.py
util.py
tests/
test_service.py
main.py
見通しが良く、保守もしやすい。
まとめ
- モジュール =
.pyファイル - パッケージ =
__init__.pyを含むディレクトリ - import には複数の書き方がある
- 自作モジュール・パッケージは驚くほど簡単
- 大規模開発にはパッケージ構造が必須