Python を学んでいくと必ず出てくるのが 「モジュール」 と 「パッケージ」。
最初は “import すると何が起きているの?” “ファイルを分ける意味って?” と迷いやすいポイントです。
この記事では、
- モジュールって何?
- import するとどうなるの?
- ファイルを分けると何が嬉しい?
- パッケージってフォルダのこと?
- name == “main” の意味は?
といった疑問を 一つずつ、ゆっくり理解できる ように解説します。
目次
1. モジュールとは?|Pythonファイルのことです
結論
「モジュール=Pythonファイル(.py)」 です。
Python はインタプリタを終了すると、その場で書いた変数・関数は全部消えてしまいます。
だから、実際のプログラムは .py ファイルに書いて保存 します。
例えば fibo.py を作ったら、それがそのまま fibo モジュールになります。
2. import すると何が起こる?
import fibo
import fibo
この一行は、 fibo.py を読み込む だけ。
ただしポイントは:
- fibo の中の関数は 直接は使えない
- 名前として追加されるのは「fibo」だけ
なので:
fibo.fib(100)
のように モジュール名.関数名 で呼び出します。
これは名前の衝突を避けるため。
“fib” という関数名が別のファイルにあっても区別しやすくなります。
3. 便利ならローカル名に割り当ててOK
from fibo import fib
fib(500)
こう書けば fib() をそのまま使えます。
ただし * や “import全部” は初心者ほど避けた方が安全です。
理由は 「どこから来た名前かわからなくなる」 ため。
4. import は最初の1回だけ実行される
モジュールは、同じ Python セッション内で 1回だけ読み込まれる 仕組みです。
つまり:
- モジュールを修正 → すぐ反映されない
- 再起動 or importlib.reload() が必要
import importlib
importlib.reload(fibo)
5. モジュールをスクリプトとしても実行したい時は
モジュールの最後におなじみのこれを書く理由が理解できます👇
if __name__ == "__main__":
...
意味
- python fibo.py と直接実行したときだけ実行される
- import fibo では実行されない
つまり「テスト用コード」や「コマンドライン処理」を書く場所。
初心者が理解しづらい部分ですが、要点は“このファイルを実行したときだけ動かしたい処理を書くスイッチ。
6. Python がモジュールを探す場所(import の仕組み)
Python はファイルを探すとき、この順番でチェックします。
- 実行中のディレクトリ
- PYTHONPATH に設定されたフォルダ
- 標準ライブラリ(site-packages を含む)
例えば、同名ファイルを自作すると、標準ライブラリより優先されることがあります。
初心者がよくやる“sys.py を作って壊す事故”の正体はこれ。
7. pycache と .pyc ファイルの役割
import すると、自動的に
__pycache__/fibo.cpython-310.pyc
のようなファイルが作られます。
これは 読み込みを速くするキャッシュ で、Python の動作速度そのものが速くなるわけではありません。
- 削除しても OK
- 自動的に再生成される
覚えておくのはこれで十分です。
8. パッケージとは?|フォルダを使った「モジュールの集まり」
重要ポイント
パッケージとは、Python モジュールをフォルダで管理したもののことです。
次のような構造を作れば、それが「パッケージ」になります👇
sound/
__init__.py
effects/
__init__.py
echo.py
init.py の役割
- 「このフォルダはパッケージですよ」と教えるマーカー
- 空でも構わない
9. パッケージの import 方法
3つ覚えればOKです。
① パッケージからサブモジュールを読込む
import sound.effects.echo
sound.effects.echo.echofilter()
② サブモジュールだけ読込む
from sound.effects import echo
echo.echofilter()
③ 関数だけ読込む
from sound.effects.echo import echofilter
echofilter()
10. パッケージで import * を使う場合
from sound.effects import *
これで全部読み込んでる気になるけど…
実は全部は読み込まれません。
パッケージ側に
__all__ = ["echo", "surround"]
のような設定がない限り、“フォルダをスキャンして全部 import” のようなことはしません。
初心者は基本的に使わなくてOK。
11. 相対 import(. や .. を使うやつ)
from . import echo
from ..filters import equalizer
ドットの数で階層を移動します。
.= 同じフォルダ..= 1つ上のフォルダ
ただし main スクリプトでは使用できません。
必ず「パッケージ内のモジュール」専用の機能です。
12. 初心者がまず覚えるべきポイントまとめ
✔ モジュール = Pythonファイル
✔ パッケージ = Pythonファイルのフォルダ集
✔ import は1度だけ読み込まれる
✔ name == “main” は「このファイルを実行したときだけ」
✔ import * は初心者ほど使わなくてOK
✔ Python がモジュールを探す場所が決まっている(sys.path)
✔ pycache は気にしなくていい
これらが理解できれば、Python の「ファイルを扱う仕組み」はもう合格です。
補足①:初心者からできる「モジュール設計」のはじめ方ガイド
「ファイルを分けた方がいいのは分かったけど、実際どう分ければいいの?」
ここでつまずく人、とても多いです。
この補足では、
- どんな基準でファイルを分ければいいか
- よくあるパターン(関数・クラス・設定ファイルなど)
- 小さなスクリプトから「ちゃんとした構成」へ育てる流れ
を、無理のないレベルで解説します。
1. まずは「役割」で分けてみる
最初から完璧な設計は不要です。
「役割(何をするコードか)」でざっくり分けるだけでOKです。
例として、次のような役割を想像してみてください。
- 計算系の処理 → calc.py
- 文字列を整える処理 → strings.py
- ファイルの読み書き → files.py
- アプリ全体の入口(実行用) → main.py
project/
main.py # 実行する入口
calc.py # 計算処理
strings.py # 文字列処理
files.py # ファイル処理
こんなレベル感で「性格の違うものを分ける」だけでも、あとで自分が読み返したときの負担がかなり減ります。
2. 「よく使う処理」はモジュールに逃がす
実際に書いていると、
- 何度も同じような処理を書く
- 別のスクリプトでも使いまわしたくなる
というパターンが出てきます。
そのときに、「この処理、1つの .py にまとめよう」と考えればOKです。
例えば、ログ出力を色々なスクリプトで使いたい場合:
# logger.py
from datetime import datetime
def log(message: str) -> None:
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"[{now}] {message}")
それを他のファイルから:
# main.py
from logger import log
log("アプリを起動しました")
「何度もコピペしてたコード」をひとつのモジュールにできたら、それだけでモジュール設計の第一歩はクリアです。
3. 「肥大化してきたら分割」で十分
書き始めの頃から細かく分ける必要はありません。むしろ難しいです。
おすすめの流れは:
- 最初は 1~2 ファイルで書く
- 行数が増えたり、役割が増えてきたら
- 「この部分だけ別ファイルに出せそう」と感じたところから分割
リファクタリングしながら分けていくイメージで大丈夫です。
4. ざっくりした「モジュール分け」の目安
初心者向けのざっくり目安としては:
- 1ファイルが 200~300 行を超え始めたら「そろそろ分けてもいいかも」
- 異なる関心ごと(例:Web処理と計算処理)が同じファイルに混ざっていたら分割候補
- 「この部分、別プロジェクトでも使えそう」と思ったら専用モジュールにする
完璧さよりも、「読みやすくするために分ける」という意識があるかが大事です。
5. 失敗してもやり直せるのがPythonの良さ
ファイル構成は、後からいくらでも変えられます。
「とりあえずこう分けてみる」「やっぱり戻す」も全然OKです。
- 同じ機能がバラバラに散ってきたら → 1つのモジュールにまとめる
- 1つのモジュールが太りすぎたら → 2つ以上に分割する
このサイクルを何度か回すうちに、自然と「モジュール設計の感覚」が身についていきます。
補足②:小さなスクリプトを「プロジェクト構成」に育てるテンプレート
次は、実際に使いやすい プロジェクト構成のテンプレート についてです。
「1つの .py だけで書いていたコードを、ちゃんとした“アプリっぽい構成”にしたい」
そんな時に、そのまま真似できる形で紹介します。
1. まずは最小構成(シンプル版)
最初に目指したい形はこれです👇
my_project/
main.py # 実行用スクリプト
modules/
__init__.py
fibo.py
utils.py
各ファイルの役割
- main.py
→ 「スタートボタン」。ここからアプリが動き出す入口。 - modules/
→ 機能をまとめておく場所(パッケージ化) - __init__.py
→ 「このフォルダはパッケージですよ」という印
空のファイルでもOK - fibo.py / utils.py
→ 実際の処理を担当するモジュール
2. 実際のコード例
modules/fibo.py
# modules/fibo.py
def fib(n: int) -> list[int]:
"""nまでのフィボナッチ数列をリストで返す"""
result = []
a, b = 0, 1
while a < n:
result.append(a)
a, b = b, a + b
return result
modules/utils.py
# modules/utils.py
def print_list(values: list[int]) -> None:
print(", ".join(str(v) for v in values))
main.py
# main.py
from modules.fibo import fib
from modules.utils import print_list
def main() -> None:
nums = fib(100)
print_list(nums)
if __name__ == "__main__":
main()
この構成にしておくと:
- main.py は「処理の流れ」に集中できる
- 細かい中身は modules/ 以下に分離できる
- 他のプロジェクトでも modules/fibo.py を再利用しやすい
というメリットが生まれます。
3. 少し発展させた構成(実用寄り)
もう少し育てると、こんな構造もよく使われます👇
my_project/
main.py # 実行用
config.py # 設定関連
modules/
__init__.py
fibo.py
utils.py
tests/
test_fibo.py # テストコード
追加されたもの
- config.py
→ 定数・設定値をまとめる - tests/
→ 関数のテストコードを置いておく場所
初心者のうちは「テストなんてまだ早い」と感じるかもしれませんが、
小さい関数ほどテストが書きやすいので、一緒に育てる癖を付けておくと後でかなり楽になります。
4. プロジェクト構成で意識したい3つのこと
- 入口が分かりやすいこと
- 「どのファイルを実行すれば動くか」がすぐ分かる(=main.py)
- 役割ごとに分かれていること
- 計算/表示/設定 などがごちゃ混ぜになっていない
- あとから拡張しやすいこと
- モジュールを増やしたり、フォルダを足しても無理なく収まる
5. 今のスクリプトを育てるおすすめステップ
- まずは今ある .py を main.py にリネーム
- よく使う関数を別ファイルにコピー → modules/ を作る
- from modules.xxx import yyy に書き換えて動くか確認
- 慣れてきたら tests/ や config.py を足していく
一気に完璧な構成を目指さないことが、挫折しないコツです。




