Follow twitter

Python if __name__ == ‘__main__’: の意味

今回は自身の備忘録としてpythonのif __name__ == ‘__main__’:
の解説をしたいと思います。

if __name__ == ‘__main__’:

まず、この子はif文であることはおわかりいただけるかと思います。
__name__は何かしらの変数かなとご想像つくかと思います。
== はイコールの意味です。
‘__main__ ‘はクオテーション’で囲まれてるので文字列だということがわかります。

つまり、もし、__name__という変数が__main__という文字列だった場合、
以下の処理を実行する。 という意味になります。

if __name__ == '__main__':
#もし、__name__という変数が__main_という文字列だった場合、以下の処理を実行する。

__name__とは

なにかしらの変数かなとはわかりました。試しにhello.pyという適当なファイルを
デスクトップに作って、print(__name__)で__name__は何かを表示してみました。

print(__name__) #ファイル名はhello.pyとしてデスクトップに保存

結果__main__と表示されました。

インタプリタで直接print(__name__)としても同じく__main__と返してきます。
つまり、__name__変数はモジュールを直接実行した場合(インタプリタ含む)、
__main__という文字列を格納することがわかります。

(今回の場合はファイル名がhello.pyなのでモジュールとはhelloということになります。)

よって、

if __name__ == ‘__main__’: とは
直接実行した場合ときにだけ、以下(if文の:以降の処理)を実行をせよ、

というif文であることがわかります。

実際、直接実行するとは、コマンドプロンプトで実行したときのことでもある。
(python 半角スペース 引数で実行する。引数は実行する.pyファイルのpathを記載する)

>python ファイルpath

__name__ == ‘__main__’ が成立しないときとは

上記の説明で __name__ == ‘__main__’ が成立するのは
モジュールを直接実行したときだとわかりました。

では成立しないのはどういうときで、その場合どういった結果がでるのでしょうか。

結論はimportしたときです。

hello.py (helloモジュール)をimportして実行するとどうなるか確認してみます。

>>>import hello #hello.pyにはprint(__main__)と記載。

結果helloと返してきます。
つまりimportしたときは__name__変数にはモジュール名を格納することがわかります。
(今回の場合はhello.pyなのでhelloがモジュール名となる)

※pythonではモジュールをimportすると自動的にそのモジュールを実行されます。

if __name__ == ‘__main__’: の目的

今までの説明より if __name__ == ‘__main__’: の目的は、
モジュールをimportしたときに、実行してほしくない時に行う処理であります。

つまり、

「コマンドでpythonファイルを実行された場合にのみ、
 if __name__ == ‘__main__’: 以降の処理を実行せよ」
と理解でもよいかと思います。

要は、作ったファイルはコマンドで実行する目的としており、
他に間違ってimportされて余計な処理を起こさないように、と個人的に理解してます。

例としてtest.pyというファイルで確認してみます。

def printname(): #printname()という関数を以下のように定義する
    print(__name__) #__name__変数の中身を表示させる処理

if __name__=='__main__': #コマンドラインなど直接実行のときのみ以下printname()を実行する
    printname()

if __name__ == ‘__main__’が書かれており以降のprintname関数が
このtestモジュール(test.pyファイル)をimportした時に実行されないか確認してみます。

>>>import test #インタラクティブで確認

ちゃんと何も出力されないことを確認できます。

次にコマンドプロンプトで実行してちゃんと出力されるか確認します。

>python test.py

ちゃんと、printtest関数が実行されて、__main__と表示されました。

終わりに

よく目にする if __name__ == ‘__main__’ ですが、たまに意味を知りたくなりますね。
普段は「おまじない」と思っておけばよいかと思います。
・コマンドラインで実行させたい関数の前に書いておくもの。
・importした時に実行されないようにするもの。
みたいな感じで理解しておけば良いかなと思います。

Have a nice python life!