はじめに
- エンジニア始めた当初、
if __name__ == '__main__'とはなんぞと思っていた。 - なんとなく、スクリプト実行に実行されるんだな〜という理解だったので、改めて調べてみた。
__name__とは
-
__name__とは属性であり、モジュール名にあたる。
>>> import numpy as np
>>> np.__name__
'numpy'
>>> numnpy.__name__
>>> import time
>>> time.__name__
'time'
- つまり、
if __name__ == '__main__'の条件分岐は__name__属性が__main__であるということ。 - それはいつなのか?...
if __name__ == '__main__' はスクリプト実行時の条件
- 結論を言えば、
__name__属性が__main__である条件はファイルがスクリプト実行された場合です。 - モジュール実行時は当てはまりません。
- 例を見てみます。
スクリプト実行のトライアル
-
test_module.pyを準備し、スクリプトを実行します。
[test_module.py]
def func():
print(f"__name__ is : {__name__}")
if __name__ == '__main__':
print("Start : if __name__ == '__main__'")
func()
❯❯❯ python test_module.py
Start : if __name__ == '__main__'
__name__ is : __main__
-
if __name__ == '__main__'の中でfunc()が実行されました。 -
__name__は__main__です。
モジュール実行のトライアル
- 次に、
test_module.pyをモジュールとして実行するスクリプト(execyte_test.py)を準備します。 -
execyte_test.pyをスクリプト実行します。
[execyte_test.py]
import test_module
print("~~~ In execute_test.py. ~~~")
print(f"__name__ is : {__name__}")
print()
print('~~~ Call test_module.func() ~~~')
test_module.func()
❯❯❯ python execute_test.py
~~~ In execute_test.py. ~~~
__name__ is : __main__
~~~ Call test_module.func() ~~~
__name__ is : test_module
-
test_module.func()の実行結果から、__name__はtest_moduleであり、if __name__ == '__main__'の条件分岐に入らないことになります。
まとめ
-
if __name__ == '__main__'はこのpythonファイルがスクリプト実行された場合というif文 -
__name__属性- スクリプト実行 ->
__main__ - モジュール実行 ->
<モジュール名>
- スクリプト実行 ->