Python入門

【解説】”if __name__ == ‘__main__'”の意味 | Python入門


ども、木村です。本業はデータサイエンティスト、副業でアプリ開発をしています。

本記事は、Pythonのソースコードでよく見かけるif __name__ == '__main__'の意味について解説します。

想定読者

if __name__ == ‘__main__’の意味がわからない方

if __name__ == ‘__main__’がなかったら?

まず最初にif __name__ == '__main__'がなかったらどうなるのかを考えてみましょう。

たとえば以下のようなPythonファイル(hello.py)を作成したとします。

def Hello():
     print("Hello")
 Hello()

このように書いても実際にファイルは動作して以下のような実行結果になります。

Hello

しかしここで一点問題が発生します。

他のファイルからこのhello.pyをimportとすると、処理は呼び出していないにもかかわず勝手に処理が実行されてしまいます。

たとえばperson.py作成し以下のように記述し実行してみてください。

import hello
 def Person():
     print("No")
 Person()

そうするとhello.pyの内容が勝手に実行されてしまいます。

これを防ぐためには、hello.pyの中身を以下のように変更する必要があります。

def Hello():
     print("Hello")
if __name__ == '__main__':
     Hello()

上記の内容でコマンドラインからperson.pyを実行するとhello.pyの内容が勝手に実行されなくなります。

“if __name__ == ‘__main__'”とは?

結論から言うと、”if __name__ == ‘__main__'”以下に書かれた処理については、コマンドライン(MacであればTerminalなど)から実行された場合のみに処理されます。

さらに、細かく分解して理解していきたいと思います。

__name__とは?

__name__とは、本来インポートしたモジュールの名前を文字列として格納してくれる標準機能です。

例えば以下のソースコードを実行してみてください。

import numpy as np
print(np.name)

実行結果

numpy

このようにインポートしたモジュールの名前を文字列として取得することができます。

ポイント

__name__は読み込んだモジュール名を保存する

'__main__'とは?

'__main__'は、コマンドラインから実行した場合自動的に__main__という文字列が__name__に設定されます。

例えばあなたがhello.pyというファイルを作成し、コマンドラインからpython hello.pyを実行した場合、'__main__'という文字列が__name__に格納されます。

ここでポイントとなるのは、格納される対象となるのはコマンドラインから実行したモジュールという点です。

ポイント

コマンドラインしたら、'__main__'という文字列が__name__に格納される

まとめ:”if __name__ == ‘__main__'”の意味

つまり上記の点をまとめると、"if __name__ == '__main__'"の意味は「もしこれから実行するファイルがコマンドラインから実行されるファイルであれば以下の処理を実行する」といった内容になります。

そのため、Pythonのファイルをコマンドラインから実行したい場合は必ず、"if __name__ == '__main__'"をする必要があるのです。

まとめ

Pythonを始めたての頃は時々目にするこの”if __name__ == ‘__main__'”の意味がわからず見るのが嫌になることでしょう。

しかし、意味さえわかればとっても簡単ですよね?

コマンドラインからPythonファイルを実行するときは”if __name__ == ‘__main__'”の記載を忘れないようにしましょう!