【未経験から始めるPython基礎⑦】「モジュール」と「パッケージ」を理解する|import の仕組み

7 min 69 views
Pythonのモジュールについて

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 はファイルを探すとき、この順番でチェックします。

  1. 実行中のディレクトリ
  2. PYTHONPATH に設定されたフォルダ
  3. 標準ライブラリ(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. 最初は 1~2 ファイルで書く
  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つのこと

  1. 入口が分かりやすいこと
    • 「どのファイルを実行すれば動くか」がすぐ分かる(=main.py)
  2. 役割ごとに分かれていること
    • 計算/表示/設定 などがごちゃ混ぜになっていない
  3. あとから拡張しやすいこと
    • モジュールを増やしたり、フォルダを足しても無理なく収まる

 5. 今のスクリプトを育てるおすすめステップ

  1. まずは今ある .py を main.py にリネーム
  2. よく使う関数を別ファイルにコピー → modules/ を作る
  3. from modules.xxx import yyy に書き換えて動くか確認
  4. 慣れてきたら tests/ や config.py を足していく

一気に完璧な構成を目指さないことが、挫折しないコツです。

関連記事