Pythonでプログラムを整理する:自作ライブラリの作り方と運用の基本
![]()
【Hiroki】
Yukiさん、こんにちは!最近Pythonの学習を進めているのですが、プログラムがだんだん長くなってきて、どこに何を書いたか分からなくなることが増えてきました。
同じような計算や処理を、別のファイルでも使い回したいと思うことがよくあるのですが、コピペ以外で解決する方法ってありますか?
![]()
【Yuki】
Hiroki君、こんにちは。プログラムが育ってくると、どうしても管理が大変になりますよね。
そういった時に役立つのが、「自作ライブラリ(モジュール)」を作るという考え方です。
自分だけの便利な道具箱を作るようなイメージですね...。
今日は、Pythonでコードを部品化して、他のファイルから呼び出す方法について、一緒に見ていけたらなと思います。
わたしも、誰かの役に立つために作られた小さなツールの話を聞くと、なんだか心が温かくなるというか...応援したくなってしまうんです。自作ライブラリも、未来の自分や誰かを助けるための素敵な第一歩だと思いますよ。
なぜ「自作ライブラリ」が必要になるのか
![]()
【Hiroki】
自分だけの道具箱、いいですね!
具体的に、プログラムを部品化するとどんなメリットがあるんでしょうか?
![]()
【Yuki】
大きく分けて3つのメリットがあると思います...。
一つ目は「再利用性」です。一度書いたコードを、別のプログラムでも一行のインポート文だけで使い回せるようになります。
二つ目は「保守性」です。もし処理に間違いが見つかっても、ライブラリ側のコードを一箇所直すだけで、それを使っているすべてのプログラムに修正が反映されます。
そして三つ目は「可読性」ですね。メインのプログラムから細かい処理を切り出すことで、全体の流れが把握しやすくなるはずです。
コードが整理されて、すっきりとしたシルエットになると、読む時のストレスもずっと少なくなりますから...。
![]()
【Hiroki】
なるほど。修正が楽になるのは助かります。
コピペだと、全部のファイルのコードを直し忘れないか不安でした。
![]()
【Yuki】
そうですよね。では、まずは一番簡単な「モジュール」の作成から始めてみましょうか。
基本の「き」:モジュールとしてファイルを読み込む
![]()
【Yuki】
Pythonでは、.py という拡張子がついたファイル一つひとつを「モジュール」と呼びます。
例えば、計算を助けてくれる my_math.py というファイルを作ってみましょう。
![]()
【Hiroki】
わかりました。やってみます!
# my_math.py
def add(a, b):
"""二つの数値を足し合わせる関数"""
return a + b
def multiply(a, b):
"""二つの数値を掛け合わせる関数"""
return a * b
![]()
【Yuki】
いいですね。次に、このファイルを読み込んで使うための、メインのプログラム main.py を同じフォルダに作ってみてください。
import というキーワードを使います。
![]()
【Hiroki】
こうでしょうか?
# main.py
import my_math
result1 = my_math.add(5, 3)
result2 = my_math.multiply(4, 2)
print(f"足し算の結果: {result1}")
print(f"掛け算の結果: {result2}")
![]()
【Yuki】
はい、完璧です。これで、my_math.py に書かれた関数を main.py から呼び出せるようになりました。
import モジュール名 と書くことで、そのファイルの中に定義された関数や変数が使えるようになるんです。
もし my_math. と打つのが少し手間に感じるなら、from my_math import add のように書くこともできますよ。
![]()
【Hiroki】
それだけでいいんですね!思ったよりもずっと簡単で驚きました。
実行時とインポート時を分ける if __name__ == "__main__":
![]()
【Hiroki】
あの、一つ気になったのですが、ライブラリ側のファイル(my_math.py)だけで動作確認をしたい時に、print 文とかを書いてテストすることってありますよね?
でも、それをそのままにしておくと、インポートした時にそのテスト結果まで表示されちゃいませんか?
![]()
【Yuki】
Hiroki君、鋭いですね...。まさにその通りです。
Pythonには、そのファイルが「直接実行された時」と「他のファイルから読み込まれた時」で挙動を変える仕組みがあります。
それが if __name__ == "__main__": というおまじないのような記述です。
![]()
【Hiroki】
おまじない、ですか?
![]()
【Yuki】
はい。Pythonの全てのモジュールには、__name__ という隠れた変数があるんです。
そのファイルが直接実行されると、この変数には "__main__" という値が入ります。
でも、インポートされた時は、そのファイルの「モジュール名」が入るようになっているんです。
これを利用して、次のように書くのが一般的ですね。
# my_math.py
def add(a, b):
return a + b
# ここから下がテスト用のコード
if __name__ == "__main__":
print("my_math.py を直接実行した時のテストです")
print(add(10, 20))
![]()
【Hiroki】
なるほど!これなら main.py からインポートした時は、if 文の中身が実行されないから、余計な出力が出ないというわけですね。
![]()
【Yuki】
その通りです。
この書き方は、自作ライブラリを作る上での「作法」のようなものなので、覚えておくと便利ですよ。
わたしも、自分だけの小さな秘密を持っているようなこの仕組み、少しだけ好きなんです。
複数のファイルをまとめる「パッケージ化」の仕組み
![]()
【Hiroki】
もっとプログラムが大きくなって、モジュールの数が増えてきたら、フォルダ分けしたくなりますよね。
そういう時はどうすればいいんでしょうか?
![]()
【Yuki】
複数のモジュールをフォルダでまとめたものを、Pythonでは「パッケージ」と呼びます。
フォルダの中に __init__.py というファイル(中身は空でも大丈夫です)を置くことで、Pythonはそのフォルダをパッケージとして認識してくれるようになります。
例えば、以下のような構成を考えてみましょう...。
project/
│
├── main.py
└── my_tools/
├── __init__.py
├── calculator.py
└── formatter.py
![]()
【Hiroki】
__init__.py がポイントなんですね。
![]()
【Yuki】
はい。Python 3.3以降では、このファイルがなくても「名前空間パッケージ」として認識されますが、パッケージの初期化処理を書きたい場合や、パッケージであることを明示するために今でもよく使われます。
この構成で calculator.py を呼び出すには、ドットを使ってこのように書きます。
# main.py
from my_tools import calculator
result = calculator.add(10, 5)
![]()
【Hiroki】
フォルダ名をドットで繋いでいくんですね。これなら、機能ごとにフォルダを分けて、綺麗に整理整頓できそうです!
インポートのパスと、より高度な管理方法
![]()
【Hiroki】
もう一つ質問させてください。
別のプロジェクトで作ったライブラリを使いたい時、毎回ファイルをコピーしてくるのは大変そうです。
自分のパソコンのどこからでも呼び出せるようにする方法はありますか?
![]()
【Yuki】
それはとても大切な視点ですね。
Pythonがインポートするファイルを探す場所を「検索パス」と言います。
基本的には「実行しているプログラムと同じフォルダ」や「Pythonのインストールフォルダ内の標準ライブラリ」などを探しています...。
![]()
【Hiroki】
その場所に、自作のファイルを置けばいいんでしょうか?
![]()
【Yuki】
それでも動きますが、あまりおすすめはしません...。
システムのフォルダを直接いじってしまうと、後で管理が大変になるからです。
自分の作ったライブラリをどこからでも使えるようにするには、主に3つの方法があります。
- PYTHONPATH という環境変数に、自作ライブラリがあるフォルダを登録する。
sys.path.append()を使って、プログラムの中で動的にパスを追加する。pip install -e .を使って、開発モードで自分のパッケージをインストールする。
![]()
【Hiroki】
どれが一番いいんでしょうか?
![]()
【Yuki】
本格的に運用するなら、3番目の方法がスマートだと思います。
setup.py や pyproject.toml という設定ファイルを用意して、自分のライブラリを一つのパッケージとして「インストール」してしまうんです。
そうすると、ライブラリの場所を気にせずに、どこからでも import できるようになります。
少し難しいかもしれませんが、将来的に自分の作ったツールを公開したいと思った時にも必要になる知識ですよ。
![]()
【Hiroki】
自分のライブラリをインストールする...なんだか、プロの開発者に一歩近づいた気がします!
まとめ:自分だけの道具を育てる楽しみ
![]()
【Yuki】
自作ライブラリの作り方、少しはイメージが湧きましたか?
最初は一つのファイルから始めて、必要になったらフォルダにまとめ、さらに必要ならパッケージとしてインストールする。
そうやって、自分のコードを少しずつ育てていくのは、とても楽しいことだと思うんです。
![]()
【Hiroki】
はい!まずはよく使う共通の処理を、一つのモジュールにまとめることから始めてみます。
コードがすっきりすれば、新しい機能を作るのももっと楽しくなりそうです。
![]()
【Yuki】
その意気です、Hiroki君。
コードを整理することは、過去の自分をいたわり、未来の自分を助けることに繋がります。
もし途中で迷うことがあっても、Pythonの公式ドキュメントがきっと助けになってくれるはずですよ。
わたしも、Hiroki君が書くコードが、誰かの役に立つ素晴らしい道具になることを願っています...。
参考資料: Python チュートリアル - モジュール
![]()
【Hiroki】
ありがとうございます、Yukiさん!
早速、今まで書いたコードを見直して、整理してみようと思います。
![]()
【Yuki】
頑張ってくださいね。
でも、あまり根を詰めすぎないように...。
休憩の時には、温かい飲み物でも飲んで、ゆっくりしてくださいね。
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。


