モジュールのインポート
Pythonではプログラムのコードをまとめたものを「モジュール」と呼んでいます。import文を使ってモジュールを読み込むと,そのモジュールの機能を利用できる(関数を呼び出せる)ようになります。
例) import random
import matplotlib.pyplot as plt
乱数の機能やグラフ描画ライブラリを利用するように,自作の関数を別のプログラムから利用したいケースもあると思います。本記事では,自作の関数を定義したPythonプログラムファイル(自作モジュール)を作り,別のプログラムファイルからその関数を呼び出す例を紹介します。
自作モジュールのコード例(自作関数のファイル)
2つの関数 disp(), hello() を定義したファイル mymodA.py を作成します。
mymodA.py
# mymodA.py def disp(str): print("mymodA's disp():",str) return def hello(): disp("Hi!") return print("module A : __name__ =",__name__) if __name__ == "__main__": disp("I am mymodA.")
実行結果
module A : __name__ = __main__
mymodA's disp(): I am mymodA.
メインモジュールのコード例(自作関数を呼び出すプログラム)
mymodA.py ファイルと同じフォルダに,関数を呼び出すプログラムを作成します。例として main.py を作成して自作モジュールを読み込んでみましょう。
main.py
# main.py import mymodA mymodA.disp("call from main.")
実行結果
module A : __name__ = mymodA
mymodA's disp(): call from main.
・import文
「import モジュール名」で指定モジュールを読み込みます。自作モジュールのファイル名がそのままモジュール名になります(.pyは不要)。
・関数の呼び出し
「モジュール名.関数名」で関数を呼び出します。
・__name__
モジュールを読み込んだだけですが,mymodA.py内の print("module A : __name__ =",__name__) が実行されています。このときの__name__には 'mymodA' というモジュール名が設定されていて,その後のif文の中は実行されていないことも確認してください。
※自作モジュール作成時には,mymodA.pyの例のような条件分岐「if __name__ == "__main__":」を利用して'__main__' のときだけ動く動作確認用のコードなどを記述できます。
import文と使用例
import文にはいくつかの記述形式があるので,例を紹介します。
もう一つ自作モジュールを mymodB.py で作成してmylibフォルダに配置したとします。
mymodB.py
# mylib/mymodB.py def disp(str): print("mymodB's disp():",str) return print(__name__) if __name__ == "__main__": disp("I am mymodB.")
ファイルの配置
01 モジュール名指定
先ほどの例を再掲します。通常はこの形式を使えばよいでしょう。
import モジュール名
関数の呼び出しモジュール名.関数名(引数)
main.pyの例import mymodA mymodA.disp("call from main.")
・import文で mymodA というオブジェクトが作られ,(クラスのインスタンスを格納した変数のように)そのオブジェクトのメソッドとして関数を呼び出すイメージです。モジュールの変数も「モジュール名.変数名」で参照できます。
02 別名をつけてインポートする
モジュール名に短い別名をつけて,コードを記述しやすくする場合に使います。
import モジュール名 as 別名
関数の呼び出し別名.関数名(引数)
main.pyの例import mymodA as mA mA.disp("identifire mA")
・別名をつけた場合も__name__には 'mymodA' が設定されます。
03 from節 モジュール内の関数をそのままの名前で使える
fromを使うと,モジュールで定義された関数名だけでコードを記述できます。
from モジュール名 import モジュール内の関数名
関数の呼び出し関数名(引数)
main.pyの例from mymodA import disp,hello disp("from + import") hello()
・関数名はカンマ , で区切って複数指定できます。
from mymodA import * # ワイルドカードで全て読み込めるが推奨されていない disp("wildcard") hello()
・関数名をアスタリスク * で指定すると,全ての関数をそのままの名前で呼び出せます。しかし,どのモジュールの関数なのかわかりにくくなるため注意が必要です。
04 フォルダ内のモジュールをインポートする例
※旧バージョンのPythonを使用している環境では,__init__.py ファイルの配置が必要になります。記事はv3.11で動作した例です。
<例04-01>
import フォルダ名.モジュール名 as 別名
関数の呼び出し別名.関数名(引数)
main.pyの例import mylib.mymodB as mB mB.disp("call from main.") # import mylib.mymodB # mylib.mymodB.disp("too long")
・イメージとしては mylibパッケージの中のmymodBモジュールという感じです。(パッケージはサブモジュールを持ったモジュール,あるいはモジュールを集めたもの,と考えてください)
・mymodB.pyでの__name__は 'mylib.mymodB' になりました。
・別名をつけない場合は,「フォルダ名.モジュール名.関数名(引数)」で関数呼び出しです。
<例04-02>
from フォルダ名 import モジュール名
関数の呼び出しモジュール名.関数名(引数)
main.pyの例from mylib import mymodB mymodB.disp("call from main.")
・fromを使用してmylibフォルダ内のモジュールを読み込めました。
<例04-03>
関数名指定のインポートも下記で動作しました。
from mylib.mymodB import disp disp("it works.")
インポート時はPythonがモジュールのファイルを探して色々なフォルダを探索します(現在の作業フォルダが最初)。ファイル名が重複しているときは目的のモジュールを読み込めないこともあるため注意してください。
【参考】__pycache__フォルダ
モジュールをインポートして使うプログラムを実行すると,モジュールのあるフォルダに__pycache__という名前のフォルダが自動的に作成されます。フォルダの中にはバイナリファイル(モジュール名.cpython-version.pyc)が作られています。
コンピュータでよく使われるキャッシュと呼ばれる仕組みで,どこかに貯めたり再利用したりで処理を速くするというものです。フォルダとファイルを残しておけば次回以降のモジュールの読み込みが高速になります。削除しても(次回またファイル作成に時間を要する以外は)とくに問題ありません。
詳しくはPythonチュートリアル「6.1.3. "コンパイル" された Python ファイル」を参照してください。(6. モジュール — Python 3.11.1 ドキュメント)