Pythonの「if __name__ == ‘__main__’:」ってなに?

Pythonプログラムを見るとたまに「if __name__ == '__main__':」と書かれているものがあります。これはどういった意味なのでしょう?

Python

プログラムの先頭

Pythonで書かれたプログラムを見るとたまに「if __name__ == ‘__main__’:」と書かれたものがあります。他の言語を学習したことのある人は、mainと書かれているのを見てプログラムの最初に定義する関数やメソッドを想像したのではないでしょうか。Pythonプログラムで書かれたこれは、位置としては最初になるのですが少し意味が変わります。

簡単に説明すると、これが記述されたPythonプログラムはモジュールなのか、そうでないのかを判断するための一文となります。

モジュールやライブラリ

モジュールやライブラリは「プログラミング考え方の基本」でも説明していますが、他のプラグラムでも利用できるプログラムの部品です。Pythonの場合はモジュールもライブラリも頻繁に目にする言葉ですが、その明確な違いは確認できません。同じような意味で使っていると思っていいでしょう。ここでは説明上モジュールに統一します。

Pythonはスクリプト言語なのでプログラムが書かれたファイルをコンパイルなしに実行できます。モジュールとして動作する場合も同様なので、他のプログラムから読み込まれたモジュールはそのまま実行できます。このモジュールを読み込むときに、Pythonでは「import」と宣言して読み込むモジュール名を記述します。そうやってモジュールに定義された関数やクラスを使用できるようになります。

「if __name__ == ‘__main__’:」とは

冒頭で簡単に、これが記述されたPythonプログラムはモジュールなのか、そうでないのかを判断するための一文となると説明しました。Pythonはいろいろなモジュールを使ってプログラムを実行しますが、構造が複雑になってくるとメインプログラムとして動作する場合とモジュールとして動作する場合の違いをプログラムで記述する必要が出てきます。そのときに、条件として自分は直接実行されているのかモジュールとして実行されているのか判断しなければなりません。その判断をこのif文で行っているのです。

「if __name__ == ‘__main__’:」を文章にすると、「もし、__name__が__main__だったら以下の処理を実行する」となります。「__name__」はグローバル変数です。例えば以下のプログラムを実行するとどうなるでしょうか。

def sampleFunc():
    print('This is main.')

if __name__ == '__main__':
    sampleFunc()

このプログラムをsample.pyというファイルに保存して実行してみましょう。

すると、

This is main.

と表示されたかと思います。ということは「if __name__ == ‘__main__’:」の条件はTrueを返したということになります。つまり、「__name__」グローバル変数には「__main__」という値が入っていた事になります。

Pythonは暗黙にプログラムが実行される際「__name__」にモジュール名が代入される仕組みとなっています。そのときに、直接実行されれば「__main__」が代入され、モジュールとして実行されればモジュール名が代入されます。

なので「if __name__ == ‘__main__’:」の条件は、「もし、プログラムが直接実行されていれば以下の処理を実行する」となるのです。

「__name__」にモジュール名が入っているかどうか確認してみましょう。上記プログラムに以下のprint文を追加します。

def sampleFunc():
    print('This is main.')

if __name__ == '__main__':
    sampleFunc()

print('Module Name: {}'.format(__name__))

このプログラムを実行してみましょう。

すると、

This is main.
Module Name: __main__

と表示されたかと思います。これでプログラムを直接実行すると「__main__」が代入されているのがわかります。

次にこのsample.pyをimportしてモジュールとして実行してみましょう。pythonを実行して対話モードにします。そして、以下を入力してみましょう。

>>> import sample
Module Name: sample

「Module Name: sample」と表示されたでしょうか。今度は「__main__」ではなくモジュール名が表示されました。これでこの条件文が正しく動作しているのがわかりました。

気づいた人もいるかも知れませんが、「モジュール名 = ファイル名」となっています。

最後に

「if __name__ == ‘__main__’:」の条件文は、1つのプログラムがモジュールとして動作したり直接実行したりするときに、それぞれ適した処理に切り替える必要があるときなどで利用します。いろんなPythonプログラムを解析すると、よく見かけることがありますし、規模の大きなプログラムを書くようになってくると必要になってくるでしょう。