前書き
Python をコマンドラインから実行するとき、おまじないのように、
if __name__ == '__main__':
run()
という内容を記載していた。
コマンドラインから直接ファイルを実行した際、 if __name__ == '__main__': のブロック内のコードが実行される。
今回の例でいえば、 run() である。
何をしている?
ファイルがモジュールとして読み込まれた際は実行されず、インタプリタに引数として直接取られたり、標準入力で受け渡されたりした際に実行される処理をここに記載している。
どうやって実現している?
コマンドラインから Python を実行すると、 __name__ というグローバル変数に '__main__' という文字列が格納される。
そのため、 if __name__ == '__main__': の条件に合致し、そのブロック以下のコマンドが実行される。
対して、ファイルがモジュールとして import された際はこの行は実行されない。
なぜ __name__ に '__main__' が格納されるのか?
ファイルがモジュールとして読み込まれたとき、「__name__」変数には、そのモジュールの名称が格納される。
以下でいうと、b.py の print(__name__) で出力されている「b」である。
$ cat <<'EOF' > a.py
import b
print(__name__)
EOF
$ cat <<'EOF' > b.py
print(__name__)
EOF
$ python a.py
結果
b
__main__
一方、ファイルがモジュールとして読み込まれたのではなく、トップレベルのスクリプトとして読み込まれた場合、「__name__」というグローバル変数に '__main__' という文字列が格納される。
さきほどの結果でいうと、 a.py の print(__name__) で出力されている「__main__」という文字列である。
'__main__' とは?
'__main__'はトップレベルのコードが実行されるスコープの名前です。
https://docs.python.org/ja/3.8/library/__main__.html