はじめに:モジュールって何?
Pythonプログラミングを進めていくと、コードがどんどん長くなってきますよね。そんなとき、関連する関数やクラスを別のファイルにまとめておくと、コードが整理されて見やすくなります。この「まとめられたファイル」のことをモジュールと呼びます。
これまでのステップで、math
やdatetime
といったPythonに標準で用意されている標準ライブラリのモジュールを使ってきました。今回は、自分でオリジナルのモジュールを作成し、それを別のPythonファイルから利用(インポート)する方法を学びましょう!
モジュールを使うメリットはたくさんあります:
- コードの再利用性向上:一度作った関数などを、色々なプログラムから呼び出して使えます。
- コードの整理:機能ごとにファイルを分けることで、どこに何が書いてあるか分かりやすくなります。
- 保守性の向上:修正が必要な場合、該当するモジュールだけを直せば良いので、メンテナンスが楽になります。
自作モジュールの作り方
自作モジュールの作成はとても簡単です。普段Pythonのコードを書いている.py
ファイル、それ自体がモジュールになれるのです!
例として、簡単な計算や挨拶をする関数を持つモジュールmy_utils.py
を作成してみましょう。
ファイル名: my_utils.py
これだけで、add
関数、greet
関数、そして定数PI
を持つmy_utils
モジュールの完成です!
自作モジュールのインポート方法
作成したモジュールを別のPythonファイル(スクリプト)から使うには、import
文を使います。先ほど作成したmy_utils.py
と同じディレクトリ(フォルダ)に、main.py
というファイルを作成して試してみましょう。
1. モジュール全体をインポートする (import
)
import モジュール名
の形式で、モジュール全体をインポートします。モジュール内の関数や変数を使うときは、モジュール名.要素名
のように記述します。
ファイル名: main.py
2. モジュールから特定の要素だけインポートする (from ... import ...
)
モジュール内の特定の関数や変数だけを使いたい場合は、from モジュール名 import 要素名1, 要素名2, ...
の形式を使います。この方法だと、要素を使うときにモジュール名を付ける必要がなくなります。
ファイル名: main.py
(別パターン)
from my_utils import *
と書くと、モジュール内のすべての要素(アンダースコア_
で始まらないもの)をインポートできますが、どの要素がどこから来たのか分かりにくくなるため、あまり推奨されません。
3. モジュールに別名をつけてインポートする (import ... as ...
)
モジュール名が長かったり、他のモジュールと名前が衝突しそうな場合に、import モジュール名 as 別名
の形式で別名を付けることができます。標準ライブラリや外部ライブラリを使う際によく使われる方法です。
ファイル名: main.py
(さらに別パターン)
同様に from モジュール名 import 要素名 as 別名
のように、特定の要素に別名を付けることも可能です。
モジュールはどこから探されるの? (モジュール検索パス)
import
文を実行したとき、Pythonはどのようにして目的のモジュールファイル(.py
ファイル)を見つけるのでしょうか? Pythonは以下の順序でモジュールを探します。
- カレントディレクトリ: スクリプトを実行しているディレクトリ。今回のように
main.py
とmy_utils.py
が同じディレクトリにあれば、すぐに見つかります。 - 環境変数
PYTHONPATH
: 環境変数PYTHONPATH
に設定されているディレクトリ。 - Pythonのインストールディレクトリ: Pythonのインストール時に設定された標準ライブラリなどが置かれているディレクトリ。
現在Pythonがモジュールを探しに行くパスのリストは、sys
モジュールのsys.path
というリストで確認できます。
スクリプト実行時だけコードを動かすおまじない:if __name__ == "__main__":
モジュールファイルは、インポートして使うだけでなく、直接スクリプトとして実行することもできます(例: python my_utils.py
)。
ここで一つ便利なテクニックがあります。それが if __name__ == "__main__":
という構文です。
- Pythonファイルが直接実行された場合、そのファイルの
__name__
という特別な変数には"__main__"
という文字列が自動的に設定されます。 - 一方、他のファイルからモジュールとしてインポートされた場合、
__name__
にはそのモジュール名(ファイル名から.py
を除いたもの、今回の例では"my_utils"
)が設定されます。
この違いを利用して、if __name__ == "__main__":
のブロック内に書かれたコードは、そのファイルが直接実行されたときだけ実行されるようにできます。これは、モジュールの動作確認のためのテストコードを書くのによく使われます。
my_utils.py
に追記してみましょう。
ファイル名: my_utils.py
(追記)
この状態で、ターミナル(コマンドプロンプト)からpython my_utils.py
と実行すると、if
ブロックの中のprint
文やテストコードが実行されます。
しかし、main.py
からimport my_utils
として実行した場合は、my_utils.py
の__name__
は"my_utils"
になるため、if
ブロックの中は実行されません。これにより、インポートしただけで余計な処理が動いてしまうのを防ぐことができます。
まとめ
今回は、自分でPythonモジュールを作成し、それを他のファイルからインポートして利用する方法を学びました。
- Pythonの
.py
ファイルはそのままモジュールとして利用できる。 import
,from ... import ...
,import ... as ...
など、様々なインポート方法がある。- Pythonは特定の検索パス(カレントディレクトリ、PYTHONPATH、インストールディレクトリ)に従ってモジュールを探す。
if __name__ == "__main__":
を使うと、ファイルが直接実行されたときだけ特定のコードを実行できる。
モジュールを使いこなせるようになると、より複雑なプログラムも整理しやすくなり、開発効率が格段にアップします!どんどん活用していきましょう。
次は、ファイルの読み書きについて学んでいきます。お楽しみに!