
前回のレクチャーで、パッケージとモジュールの分け方と、importの仕方を学習しました。このレクチャーでは、各モジュールが直接実行された時と、importで読み込まれた時の区別の仕方を学習します。
Pythonでは、「どう実行されたか」を判断するための仕組みが用意されています。それが今回学ぶ、__name__とif __name__ == '__main__'です。
Table of Contents(目次)
Pythonの __name__ の意味とは?しくみと役割をわかりやすく解説
Pythonには、スクリプトを実行する際に自動的に定義される「特殊変数」がいくつかあります。その中のひとつが__name__(ダブルアンダースコアで囲まれた名前)です。
__name__は「このスクリプトがどのように実行されたか」を表します。つまり、「このファイルが直接実行されたのか、他のファイルからimportされたのか」を判別するための目印です。
__name__ を確認するサンプルコード(check_name.py / import_test.py)
fortune_cookieのパッケージとは別に、check_name.pyとimport_test.pyを作成します。(2つのファイルは、同じディレクトリに作ります。)
# check_name.py
print('このファイルの __name__ は:', __name__)
このコードは、__name__の値を表示するだけの、非常にシンプルなものです。
# import_test.py
import check_name
__name__ の値がどう変わるか実行結果で確認する
① まずはcheck_name.pyを直接実行してみましょう。VisualStudioCodeでcheck_name.pyを開き、実行します。
出力結果:
このファイルの __name__ は: __main__
② 次に、このファイルをimport_test.pyからimportしてみましょう。VisualStudioCodeでimport_test.pyを開き、実行します。
出力結果:
このファイルの __name__ は: check_name
つまり、__name__の値は、ファイルを直接実行したときには"__main__"に、他のファイルからimportされたときには"モジュール名"(ファイル名から拡張子.pyを除いたもの)になります。Pythonはこの値を使って、「どのように実行されたのか」を判断しているのです。
Pythonの if __name__ == '__main__' の意味と使い方を徹底解説
上の仕組みを利用すると、次のようなコードを書けるようになります。
def main():
print('メイン処理を実行します')
if __name__ == '__main__':
main()
この構文の意味はとてもシンプルです。
「もしこのファイルが直接実行されたときだけ、main()を実行してね」
これを入れておくことで、他のファイルからこのモジュールをimportしたときに、自動的にmain()が動いてしまうのを防ぐことができます。いわば「勝手に動かないようにする安全装置」です。
Pythonのネームスペースとは?モジュールごとに独立する仕組み
ここで、あわせて理解しておきたい大切な考え方があります。それが「ネームスペース(namespace・名前空間)」です。
ネームスペースとは、変数や関数の「名前」を管理するための独立した箱のようなものです。Pythonでは、各モジュールごとに独立したネームスペースが作られています。あるモジュールの中で定義した関数や変数は、別のモジュールには影響しません。
つまり、直接実行しているモジュール・モジュールA・モジュールBがmain()という同じ名前の関数をもっていても、それぞれ完全に独立して管理されます。それぞれ、main(), A.main(), B.main()と記述することで、指定したモジュールのmain()を実行することができます。
モジュール間で変数が独立する理由と実例コード
fortune_cookieのパッケージとは別に、module_a.py, module_b.py, main.pyを作成し、mainモジュールを実行してみてください。
# module_a.py
value = 'Aの値'
# module_b.py
value = 'Bの値'
# main.py
import module_a
import module_b
print(module_a.value)
print(module_b.value)
出力結果:
Aの値
Bの値
同じvalueという変数名を使っていても、各モジュールの中で独立して管理されているのが確認できます。これがネームスペースの仕組みです。
__name__ と __main__・ネームスペースのポイント総まとめ
| 概念 | 内容 |
|---|---|
__name__ | モジュールの識別名を表す特殊変数 |
"__main__" | ファイルを直接実行した際に__name__に代入される値 |
if __name__ == '__main__': | ファイルを直接実行した時に、ブロック内の処理を実行させるための構文 |
| ネームスペース(namespace・名前空間) | 変数や関数を識別するための、モジュールごとに独立した管理空間 |






