Python

【Python】if __name__ == '__main__': とは

Pythonを学び始めると、if __name__ == '__main__':という記述が色々なソースで出てくる。
なんのための記述なのかを調べたのでメモ。

結論

このファイルが直接実行されているか(python ファイル名.pyの形で実行されているか)を判定するif文。

__name__とは

Pythonのスクリプトを実行する時に、モジュール名が自動的に代入される変数。

中身を確認するために、以下の2つのモジュールを作成。

test.py
import sub
print("test.pyの出力:", __name__)
sub.py
print("sub.pyの出力:", __name__)

test.pyを実行すると、以下の結果が得られる。

execute
$ python test.py
sub.pyの出力: sub
test.pyの出力: __main__

直接実行したtest.pyの__name____main__が代入されており、
importしたsub.pyの__name__にはモジュール名が代入されている。

このことから、if __name__ == '__main__':は、モジュールが直接実行された場合に実行されるif文であることがわかる。
当然ながら、python sub.pyを実行すると、出力はsub.pyの出力: __main__となる。

なぜ必要なのか

上記の問題点として、sub.pyをimportした時点でsub.pyの処理が実行されてしまっている。
やりたいこととしては、test.py側でその都度sub.pyのメソッドを利用することである。
これを実現するために、if文を追加する。

test.py
import sub

print("test.pyからsub.pyのoutput()をコール")
sub.output()
print("test.pyの出力:", __name__)
sub.py
def output():
    print("sub.pyの出力:", __name__)

if __name__ == '__main__':
    output()

これを実行すると、

execute
$ python test.py
test.pyからsub.pyのoutput()をコール
sub.pyの出力: sub
test.pyの出力: __main__

となり、import時点ではsub.pyの処理は実行されずに、test.py内から都合のいいタイミングでsub.pyモジュールをコールできていることがわかる。
このように、モジュールをimportした時にそのモジュールの処理を実行させないために、if __name__ == '__main__':は必要となる。
  
  

参考

http://blog.pyq.jp/entry/Python_kaiketsu_180207
https://qiita.com/wslife/items/edf7a2309f3421723550
https://docs.python.jp/3/reference/import.html?highlight=__name__#__name__