Python 自作関数を別ファイルから呼び出す

モジュールのインポート

 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 の実行結果で __name__ という組み込み変数に文字列 '__main__' が設定されています。__name__はプログラムが起動されたときに値が決まります。ファイル名を指定して実行するなど,プログラムの中で最初に実行されたときは '__main__' になり,モジュールとして読み込まれたときはモジュール名になります。(次の手順で名前が変わることを確認します)

 

メインモジュールのコード例(自作関数を呼び出すプログラム)

 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.

main.pyを実行して,mymodAのdisp()関数を呼び出すことができました。

・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 ドキュメント


 

関連記事

 kinutani.hateblo.jp