1. はじめに|Pythonのコード、もっと整理してみよう
Pythonでプログラミングをしていると、最初は1つのファイルにどんどんコードを書いていくことが多いですよね。でも、コードが増えてくると…
「どこに何を書いたか分からない…」
「似たような処理を何度もコピペしている…」
「バグが出たけど、原因が追えない…!」
こんなふうに、コードがごちゃごちゃになって管理が難しくなることってありませんか?
そんなときに便利なのが、「自作モジュール」という考え方です。
自作モジュールとは、自分で作ったPythonファイルを再利用可能なパーツとして分けて使う方法のこと。たとえば、計算用の関数を calc_utils.py にまとめておいて、別のファイルから呼び出せるようにするイメージです。
なぜモジュール化すると便利なの?
- コードがスッキリ整理される!
→ 機能ごとにファイルを分けることで、読みやすさ・保守のしやすさがアップ! - 同じ処理を何度も書かなくていい!
→ 使いまわせる関数やクラスをモジュールにまとめておけば、繰り返し使えて便利! - 複数人の開発でも役立つ!
→ ファイル単位で役割を分担しやすくなり、チーム開発にも対応しやすくなります。
このように、自作モジュールを使うことで、Pythonのコードをよりきれいに、より効率よく書けるようになります。
この記事では、そんな「自作モジュールの作り方・使い方」について、初心者の方にもわかりやすく、やさしく解説していきます。
それではさっそく、モジュールの基本から始めてみましょう!
2. 自作モジュールってなに?
まずは「モジュール」という言葉の意味から確認しましょう。
Pythonでは、1つの .py ファイル = モジュールと呼ばれます。
たとえば、math.py や random.py など、Pythonに標準で用意されているモジュールもありますね。これらと同じように、自分で作成した .py ファイルもモジュールとして使えるのです。
✅ 自作モジュールのイメージ
たとえば、こんなふうにファイルを分けたとします:
project/
├─ main.py ← 実行するメインのスクリプト
├─ utils.py ← 自作モジュール(関数をまとめたファイル)
このとき utils.py に書いた関数を main.py から呼び出せば、それだけで自作モジュールの完成&活用です!
✅ なんでわざわざ分けるの?
1つのファイルに全ての処理を書くこともできますが、コードが長くなると読みにくくなってしまいます。
そこで、**「機能ごとに分ける」=「モジュールにする」**ことで、次のようなメリットが生まれます。
| メリット | 説明 |
|---|---|
| ✅ 再利用性 | 同じ関数を何度も書かなくて済む |
| ✅ 保守性 | バグの原因が見つけやすくなる |
| ✅ 可読性 | ファイルごとの役割がはっきりする |

とくにPythonでは、モジュール化が非常に簡単!特別なツールや設定もいらず、ただ別ファイルに関数やクラスを書く→importするだけでOKなんです。
3. 自作モジュールを作ってみよう【基本編】
ここからは実際に、自作モジュールを作って使う方法を見ていきましょう!
✅ ステップ①:ファイルを2つ用意しよう
まずは、次のようなフォルダ構成を作ります。
my_project/
├─ main.py ← 実行するファイル(メインスクリプト)
├─ utils.py ← 自作モジュール(関数をまとめる)
ここでは utils.py に関数をまとめておいて、main.py から呼び出す構成にします。
✅ ステップ②:自作モジュール(utils.py)を作る
たとえば、文字列を逆にする関数を utils.py に書いてみましょう。
# utils.py
def reverse_string(s):
return s[::-1]
これだけでモジュールの準備はOK!とっても簡単ですね。
✅ ステップ③:メインスクリプト(main.py)で使ってみる
次に main.py でこの関数を使ってみましょう。
# main.py
import utils # 自作モジュールを読み込む
text = "Hello, Python!"
reversed_text = utils.reverse_string(text) # モジュール名.関数名 の形式で使う
print(reversed_text) # → "!nohtyP ,olleH"
このように、自作モジュールを読み込むには import ファイル名(拡張子.pyは不要)と書きます。そして関数を使うときは、モジュール名.関数名 の形で呼び出せばOKです。
✅ ワンポイント:別名で使いたいときは?
もしモジュール名が長い・複数回使う場合は、as を使って別名をつけてもいいですよ。
import utils as ut
print(ut.reverse_string("shorter syntax"))
4. if __name__ == "__main__": を使う理由
Pythonのコードを書いていると、たまに見かけるこんな書き方👇
if __name__ == "__main__":
print("これはメインスクリプトとして実行されたときだけ表示されます")
「なにこれ?なんでわざわざこんなこと書くの?」と思ったことありませんか?
これは、そのファイルが“直接実行されたかどうか”を判断するための書き方なんです。
✅ どういうこと?
Pythonの .py ファイルは、そのまま実行することもできるし、他のファイルからインポートして使うこともできますよね。
でももし、こんなコードがモジュールに書いてあったらどうなるでしょう?
# utils.py
print("モジュールが読み込まれました!")
def reverse_string(s):
return s[::-1]
そして main.py でインポートしたら…
import utils # この時点で「モジュールが読み込まれました!」が表示されてしまう!
つまり、importしただけで不要な処理が実行されてしまうんです💦
✅ そこで登場!if __name__ == "__main__":
これを防ぐために、直接実行されたときだけ動かしたいコードをif __name__ == "__main__": の中に書いておくのがベストプラクティス。
# utils.py
def reverse_string(s):
return s[::-1]
# テストコードはここに入れる
if __name__ == "__main__":
print(reverse_string("テスト")) # これは直接実行したときだけ表示される
このようにしておけば、utils.pyをインポートしても、テスト用のprint()は実行されません。
一方で、utils.pyを単体で実行すれば、ちゃんと動いてくれます。
✅ なぜ __name__ をチェックするの?
Pythonでは、スクリプトが直接実行された場合は __name__ に "__main__" が入ります。
一方、他のスクリプトからインポートされた場合は、__name__ にはファイル名(例: utils)が入るんです。
これを利用することで、メインとして動くときだけ実行される処理を分けられる、というわけです。

この構文を使うことで、テストコードを安全に書けるし、モジュールとしての再利用性も高まるので、ぜひ覚えておきましょう!
5. サブフォルダからモジュールを読み込むには?
プロジェクトが大きくなってくると、モジュールをまとめてフォルダで整理したくなりますよね。
たとえば次のような構成です👇
my_project/
├─ main.py
├─ tools/
│ └─ string_utils.py
このとき、main.py から tools/string_utils.py を使いたいときはどうしたらいいのでしょう?
✅ フォルダをまたいだインポートの基本
答えは簡単!次のように書けばOKです。
from tools import string_utils
print(string_utils.reverse_string("Hello"))
つまり、
from フォルダ名 import モジュール名- ファイル名から
.pyは除く - フォルダ名とファイル名は ピリオドでつなぐ
だけです。
✅ さらに深いフォルダでもOK!
例えばもっとフォルダが深くなっていたとしても、ルールは同じです👇
my_project/
├─ main.py
├─ utils/
│ └─ string/
│ └─ formatter.py
この場合はこう書きます:
from utils.string import formatter
ポイントは、どのファイルから実行されるかを基準に、そこからのパスで考えること。
この例だと、main.pyがスタート地点なので、そこから見たパスで指定します。
✅ __init__.py は必要?
昔のPython(3.3以前)では、フォルダをモジュールとして認識させるために__init__.py という空ファイルをそのフォルダに置く必要がありました。
utils/
├─ __init__.py
├─ string/
│ ├─ __init__.py
│ └─ formatter.py
現在のPythonでは、必須ではありませんが、
「昔の環境にも対応したい」「安心してモジュールとして使いたい」場合は入れておくのが無難です。

このように、Pythonではフォルダで整理してもモジュールとして簡単に使えるようになっています。
プロジェクトが大きくなる前から、しっかり分けておくとあとで管理しやすくなりますよ!
6. モジュール間での相互インポート
ここまでで、自作モジュールを作る方法や、サブフォルダからモジュールを読み込む方法を学びました。
ここではもう一歩進んで、モジュール同士が別のモジュールを呼び出す(相互インポート)方法を解説します。
✅ こんなフォルダ構成の場合
まずは以下のような構成を例にしましょう:
my_project/
├─ main.py
├─ sub_folder1/
│ └─ sub_module1.py
├─ sub_folder2/
│ └─ sub_module2.py
このとき、main.py は sub_module1.py を使い、sub_module1.py の中では sub_module2.py を使いたい、というケースです。
✅ main.py からの呼び出し(基本)
# main.py
from sub_folder1 import sub_module1
sub_module1.do_something()
ここまではすでにおなじみのインポートの書き方ですね。
✅ sub_module1.py から別モジュールをインポート
次に、sub_folder1/sub_module1.py の中で、sub_folder2/sub_module2.py を使いたい場合はこうします:
# sub_folder1/sub_module1.py
from sub_folder2 import sub_module2 # 実行ファイルが main.py のとき基準で書く
def do_something():
print("sub_module1からの処理")
sub_module2.helper() # sub_module2 の関数を使う
ポイントは、main.py を起点としてパスを考えることです。
Pythonのインポートは「今動いているファイル」ではなく「実行されているファイル(main.py)」からの相対パスで決まります。
✅ sub_module2.py の中身(例)
# sub_folder2/sub_module2.py
def helper():
print("sub_module2のヘルパー関数が呼ばれました")
これで、main.py を実行すると以下のように動きます:
sub_module1からの処理
sub_module2のヘルパー関数が呼ばれました
✅ 注意点:直接実行しないこと!
この書き方は、sub_module1.py を直接実行してしまうと失敗します。
なぜなら、インポートパスが main.py からの基準で書かれているからです。
つまり、この書き方は「モジュールは直接実行しない」という前提で成り立っています。
# NG例(これはエラーになる可能性あり)
python sub_folder1/sub_module1.py

モジュール単体で動かしたいときは、if __name__ == "__main__": を使って、必要なインポートを工夫して書き換える方法もあります。
ただし、あくまでモジュールは“部品”として使うのが前提と覚えておくと良いでしょう。
7. 自作モジュールでコードを整理しよう!
ここまで、自作モジュールの作り方・使い方・応用までを学んできました。
このセクションでは、**「なぜモジュール化が大事なのか?」**という視点から、モジュール化のメリットを改めて整理してみましょう!
✅ モジュール化のメリットまとめ
| 項目 | メリット |
|---|---|
| ✅ 見通しの良さ | 役割ごとにファイルを分けることで、コード全体がスッキリ見やすくなります。 |
| ✅ 再利用性 | よく使う関数や処理をモジュールにまとめておけば、別のプロジェクトでもすぐ使い回せます。 |
| ✅ テストしやすい | モジュールごとに動作確認ができるので、バグの原因も見つけやすくなります。 |
| ✅ チーム開発にも便利 | 機能単位でファイルを分担できるため、複数人での開発もスムーズになります。 |
✅ たとえば、こんな変化が!
Before:1ファイルにすべてを書いていたころ…
# main.py
# 1000行を超えるごちゃごちゃコード
- どこに何があるか分からない…
- 少し編集しただけで別のバグが出る…
- 関数が重複している…
↓
After:モジュールで機能ごとに整理!
project/
├─ main.py
├─ calc_utils.py
├─ string_utils.py
├─ file_utils.py
- 処理の流れが見える!
- 必要な場所だけを編集すればOK!
- 再利用できる関数が増える!

「モジュール化ってなんだか難しそう…」と思うかもしれませんが、
最初は 関数を別ファイルに分けてimportするだけで十分です!
少しずつ「共通処理はまとめようかな」「この機能は別ファイルにしようかな」と考えていくうちに、自然とモジュール設計のスキルも身についていきますよ✨
8. まとめ|モジュール化でスッキリ管理!
この記事では、Pythonの自作モジュールについて、基礎から応用までじっくり解説してきました。
✅ ここまでの振り返り
- Pythonの
.pyファイルは、それ自体が「モジュール」として使える import文を使えば、別ファイルの関数やクラスを簡単に呼び出せるif __name__ == "__main__":を使えば、インポート時の不要な実行を防げる- フォルダで整理しても、パス指定で柔軟にモジュールを読み込める
- モジュール間の相互インポートも可能(ただし実行ファイル基準でパス指定)
✅ モジュール化のコツ
- まずは小さな関数から分けてみよう
- ファイル名は分かりやすく!例:
math_utils.py,string_tools.pyなど - テストコードは
if __name__ == "__main__"の中へ - 大きなプロジェクトになってからではなく、早めに分割を意識すると楽!
✅ 次のステップは?
モジュールを使いこなせるようになったら、次は…
from ... import ...やasを使ったインポートの応用テクニック- Pythonパッケージとしてモジュールを再配布する方法
- 外部モジュールの使い方(pipやvenvでインストールする方法)
などに挑戦してみるのもおすすめです!

Pythonの魅力のひとつは、「誰でも簡単にコードを分割して整理できる」こと。
モジュールを使いこなせば、あなたのコードがもっと“プロっぽく”なります!
ぜひ、今回学んだ内容を実際のプロジェクトで試してみてくださいね 😊
あわせて読みたい
自作モジュールに関連するおすすめ記事を紹介します。あわせて読むことで理解がさらに深まります!
- 🔗 【Python入門】インデントルール完全ガイド|スペースとタブの違いって?
→ モジュール化されたコードでもインデントが崩れるとエラーになるので要チェック! - 🔗 Python初心者が1日で作れる簡単アプリ集|日常に役立つプチ開発体験!
→ 小さなアプリでもモジュールを使ってキレイに整理することができます!
よくある質問(Q&A)
- Qモジュール名に日本語やハイフンを使ってもいいの?
- A
いいえ、モジュール名(ファイル名)には半角英数字とアンダースコア(_)のみを使うのが基本です。ハイフン(-)や日本語は避けましょう。
- Q同じ名前のモジュールが複数あったらどうなる?
- A
Pythonは最初に「sys.path」という場所を順番に見てモジュールを探します。重複する名前があると、意図しないモジュールが読み込まれることもあるので注意が必要です。
- Qモジュールはどれくらいに分ければいいの?
- A
「1ファイル=1つの目的・機能」を意識するのが基本です。関数が5〜10個以上になってきたら、ファイル分割を検討してみましょう。







※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。
※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。