【Python】 if __name__ == “__main__” とはなにか

if __name__ == “__main__”:とはなにか

if __name__=="__main__": が記述ある場合に、「ファイル名.py 」がモジュールとして、他のプログラムから読み込まれ場合に、if __name__=="__main__": 配下の処理を実行させないようにするためのif文だとご理解ください。

if __name__ == "__main__": があると、モジュールがPythonスクリプトとして起動された場合(*例えばpython ファイル名.py 等にて実行された場合)のみ、if __name__ == “__main__”: 配下の処理が実行されます。)

厳密には、if __name__ == “__main__”:という記述は、そのPythonファイルが「pythonファイル名.py」という形で実行されているかどうか」を判定するif文になります。

例えば、sample.pyという以下のコードが書かれたPythonプログラムがある場合を考えます。

def sample_func():
    print("sample func")
    print(__name__)    
sample_func()

この場合、 import sample として読み込むと以下のように出力されます。

sample func
__sample__

これはPythonでは、インポートされたファイルの中身は実行されるためです。 そのため、単にインポートしただけなのに sample_func()の処理が実行されてしまいます。

この時、import sample としてモジュールとして読み込まれた「sample.py」のprint(__name__)の出力は、ファイル名(モジュール名)の「__sample__」になっていることに注目してください。

モジュールとして読み込まれた場合、__name__ にはモジュール名が格納されるため、今回は「sample.py」なので、__sample__と出力されましたが、モジュール名(ファイル名)が例えば、「test.py」であれば、出力は__test__ と出力されます。

このように、モジュールとして読み込まれた場合に、__name__ には、モジュール名がセットされることを理解しておきましょう。

一方で、「python sample.py」と実行すると以下のようになります。

sample func
__main__

この時、print(__name__) の出力が、スクリプトとして実行されたため、__main__ になっていることに注目してください。
先ほどでは、モジュールとして読み込まれた時には__name__にはモジュール名でしたが、スクリプトとして実行された場合には、__main__ に変わります。

print(__name__) の挙動がimportされた時と、pythonコマンドで実行した時の出力結果が違うことを理解しておきましょう。

if __name__ == “__main__”: はいつ使うのか

先ほど説明しました通り、__name__ はモジュールとして読み込まれた時と、スクリプトとして実行された時に格納される値が異なります。この性質を利用することで、スクリプトとして実行された場合にのみ、ある処理を実行したいと言った処理を実現できます。

仮に、if __name__ == “__main__”:の記述がない場合、 import しただけで、その読み込んだライブラリの処理が実行されるのは面倒なので、 if __name__ == “__main__“: という一文を書いておくと、特定のライブラリをインポートした時にその内部のプログラムが動かないようにするために記述します。

def sample_func():
    print("sample func")

if __name__ == "__main__": 
    sample_func() 

sample.pyの中身が上記であれば、import sample としても、sample_func()は実行されません。

またsample.pyを以下のように書き換えてみます。

def sample_func():
    print("sample func")

print(__name__) # この行を追加
if __name__ == "__main__": 
    sample_func()

この状態のsample.pyをモジュールとして読み込んだ場合に、「print(__name__) 」の出力は、「sample」(ファイル名・モジュール名)と出力されることがわかります。

そのため、if __name__=="__main__": がTrueにならず(条件が成立しないため)、if __name__=="__main__": 配下の処理(つまり6行目のsample_func())が実行されないということになります。

上記のことから、if __name__ == “__main__”:という記述は、そのPythonファイルが「pythonファイル名.py」という形で実行されているかどうか」を判定するif文になり、加えると__name__が__main__(すなわちメインのスクリプトである場合)を判定しているif文になります。

Pythonを効率よく学ぶには?

Pythonを効率よく学ぶには、普段からPythonを利用している現役のデータサイエンティストや機械学習エンジニアに質問できる環境で学ぶことです。
質問し放題かつ、体系的に学べる動画コンテンツでデータ分析技術を学びたい方は、オンラインで好きな時間に勉強できるAI Academy Bootcampがオススメです。受講料も業界最安値の35,000円(6ヶ月間質問し放題+オリジナルの動画コンテンツ、テキストコンテンツの利用可能)なので、是非ご活用ください。