はじめに
- エンジニア始めた当初、
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__
- モジュール実行 ->
<モジュール名>
- スクリプト実行 ->