【Python】if __name__==’__main__’を理解する

スポンサーリンク

Pythonをやっていると、よく見るコードif __name__==’__main__’

今回はこのif __name__==’__main__’について理解を深めようと思います。

結論から言うとif __name__==’__main__’は、
スクリプトとして直接実行したときにのみ処理させたいときに使う構文です。

if __name__==’__main__’の使い方

サンプルとしてtest1というprint文のみを実行する関数を作成します。

def test1():
    print('関数test1が実行されました。')

test1()

このpyファイルをスクリプトとして実行するとtest1の関数が実行されていることが確認できます。

python test1.py

(実行結果)
関数test1が実行されました。

次に別ファイルtest2.pyを作成して先ほど作成したtest1をimportしただけのpyファイルを作成します。

import test1

この状態でスクリプトとしてtest2.pyを実行します。

python test2.py

(実行結果)
関数test1が実行されました。

実行すると先ほどと同じ結果になりました。
pythonの関数(def)やクラス(class)内の処理は、基本的にimport時に処理が実行されます。

次にtest1.pyにif __name__==’__main__’を追加してみます。

def test1():
    print('関数test1が実行されました。')
    
if __name__=='__main__':
    test1()

この状態でtest2.pyを実行します。

python test2.py

(実行結果)

この場合は関数test1が実行されていないので何も表示されません。
関数test2をスクリプトとして直接実行したのでtest1の関数test1は、実行されません。

次にtest1.pyを実行します。

python test1.py

(実行結果)
関数test1が実行されました。

この場合はtest1.pyをスクリプトとして直接実行しているので関数test1は実行されます。

if __name__==’__main__’は、ifブロック以下にスクリプトとして直接実行されたときのみに実行したい処理があった場合に使用します。

スクリプトとして直接実行したときは処理を行い、importされたときは処理を行わないなどの実行制御に使用することが多いです。

特殊変数__name__と__main__

基本は上述の内容を理解しておけば問題ないと思いますが、そもそも__name__は何なのかというのが気になったので調べてみました。

__name__は、特殊変数と呼ばれており、「__名前__」の形をしています。この特殊変数__name__にはPythonファイルごとのファイル名が代入されます。ただし、例外としてスクリプトとして直接実行した場合のみ__name__には__main__が代入されます。

例として上記で作成したtest1.pyに以下のコードを追加して__name__の中身を確認してみます。

def test1():
    print('関数test1が実行されました。')

print(__name__)
if __name__=='__main__':
    test1()

この状態でtest1.pyを実行すると__name__に__main__が代入されていることが分かります。
この場合はif __name__==’__main__‘:の条件に合致するのでifブロック以下の関数test1()が実行されます。

python test1.py

(実行結果)
__main__
関数test1が実行されました。

test2.pyを実行した場合は、直接実行していないのでファイル名test1が代入されています。
__name__の値はtest1なので当然 if __name__==’__main__‘:の条件には該当されず
関数test1()は実行されません。

python test2.py

(実行結果)
test1

まとめ

if __name__==__main__:は、

  • スクリプトとして直接実行したときにのみ処理させたいときに使う
  • 関数やクラス内の処理は、基本的にimport時に処理が実行される
  • importされたときは処理を行わないなどの実行制御に使用することが多い
  • 特殊変数__name__はPythonファイルごとのファイル名が代入される
  • スクリプトとして直接実行した場合は例外として__name__に__main__が代入される

コメント

タイトルとURLをコピーしました