Pythonのプログラムでよく見かけるif __name__ == “__main__”:という記述。ここからプログラムが始まるといった感じの漠然な理解の方も少なくないのではないでしょうか。
今回はif __name__ == “__main__”:について、簡単な例を添えてその役割を見ていこうと思います。
if __name__ == “__main__”:の正体
Pythonでは関数やクラスといったモジュールを作成することができ、それらはプログラムから呼び出すこともできれば、プログラムとして直接実行することもできます。
モジュールとして作成したスクリプトをテストする場合はそのモジュールのプログラムを直接実行することになると思いますが、実際の用途としてはモジュールをインポートすることになり、両者では動作を変える必要があります。
ここで出てくるのがif __name__ == “__main__”:です。__name__はプログラムを直接実行した場合、値が__main__となります。これを利用して、if __name__ == “__main__”:以下には直接実行した場合にのみ実行したい処理を書きます。
逆を言うと、if __name__ == “__main__”:以下はモジュールとしてインポートした場合には実行されません。
__name__の中身を確認してみる
実際に簡単なプログラムから__name__の中身を確認してみましょう。
以下のようなmain.pyとsample.pyを用意します。
import sample
print("main.pyは "+__name__)
if __name__ == "__main__":
print("main.pyを実行")
print("sample.pyは "+__name__)
if __name__ == "__main__":
print("sample.pyを実行")
main.pyを実行したときの出力結果を見ると、以下のようになります。
>> sample.pyは sample
main.pyは __main__
main.pyを実行
sampleをインポートした時点でsample.pyが実行されます。このとき、sample.pyの__name__はsampleであることがわかります。なので、if __name__ == “__main__”:以降は実行されていません。
一方main.pyでは、__name__が__main__となっています。なので、if __name__ == “__main__”:以降の処理も実行されます。
ちなみに、sample.pyを直接実行した場合の出力結果は以下のようになります。
>> sample.pyは __main__
sample.pyを実行
このように、直接実行したスクリプトでは__main__が、呼び出した場合はモジュール名が__name__に入ります。
まとめ
if __name__ == “__main__”:の意味とその挙動について紹介しました。このように直接実行するかモジュールとして呼び出すかで挙動を変えられるほか、メインのスクリプトだということを明示的に表すこともできます。
複数のモジュールを使うような複雑なプログラムを作成する場合は、if __name__ == “__main__”:を付けることをオススメします。
ではでは👋