Pythonのコードを学び始めると、ほぼ必ず出会うのがif __name__ == "__main__":という一行です。
一見すると意味不明な記号の並びですが、Pythonプログラムの「入口」や「実行されるタイミング」をきれいに制御するための、とても重要なしくみです。
この記事では、この一行の意味から、使う理由、具体的な書き方、よくある疑問まで、初心者向けに丁寧に解説していきます。
Pythonのif __name__ == “__main__”とは
if __name__ == “__main__”の基本的な意味

Pythonのif __name__ == "__main__":は、「このファイルが直接実行されたときだけ、ここから下の処理を実行してください」という意味になります。
自然な日本語にすると、次のようになります。
- 「このファイルを、Pythonコマンドで直接実行したときだけ、この中のコードを動かしてね」
- 「ほかのファイルから
importされたときには、この中のコードは動かさないでね」
この判断をしている鍵が__name__という特別な変数です。
Pythonは、各ファイル(モジュール)ごとに__name__という変数を自動で用意してくれます。
__name__と”__main__”が示すもの

ここで登場する__name__と"__main__"が何を意味しているのかを整理します。
まず__name__は、「そのファイル(モジュール)の名前」を表すために、Pythonが自動で用意する特別な変数です。
ダブルアンダースコア__が前後に付いているのは、Pythonの内部的な予約された名前であることを示しています。
__name__には、次のような値が入ります。
- ファイルを直接実行したとき
→__name__には"__main__"が入る - ファイルを別のファイルからimportしたとき
→__name__には"ファイル名(拡張子なし)"が入る
例:utils.pyなら"utils"
つまり
"__main__"という文字列は、「今まさに実行しているメインのスクリプト」を表す特別な名前です。
そのためif __name__ == "__main__":と書くと、「このファイルがメインとして実行されているときだけ」という条件が作れるわけです。
Pythonが__name__を設定する仕組み

Pythonインタプリタは、スクリプトを読み込むときに、次のような流れで__name__を設定します。
1つのスクリプトを直接実行する場合
- コマンドラインなどから
python myscript.pyが実行される - Pythonは
myscript.pyを「メインスクリプト」として読み込む - このとき
myscript.pyの中では__name__ = "__main__"と自動的に設定される - ファイルの先頭から順番にコードを実行していく
別ファイルからimportされる場合
import mymoduleが呼ばれる- Pythonは
mymodule.pyをモジュールとして読み込む - このとき
mymodule.pyの中では__name__ = "mymodule"と自動的に設定される - ファイルの先頭から順番に「定義部分など」を実行して、モジュールとして登録する
このように同じファイルでも「どうやって読み込まれたか」によって__name__の値が変わるため、それを判定に使うことで挙動を切り替えられるのです。
if __name__ == “__main__”を使う理由
直接実行とモジュール(import)の違い

Pythonファイルは、大きく分けて2つの使い方ができます。
- コマンドとして直接実行する
例:python tool.pyのように実行し、画面に結果が表示される - ライブラリのようにモジュールとしてimportして使う
例:import toolとして、その中の関数やクラスを利用する
同じファイルを「コマンド」としても「部品」としても使えるようにするために、if __name__ == "__main__":があります。
- 直接実行のときだけ動いてほしい処理(ユーザーへのメッセージ表示、メイン処理など)は
if __name__ == "__main__":の中に書く - どちらのケースでも使いたい処理(関数定義やクラス定義など)は、条件分岐の外に書いておく
こうすることで、1つのファイルが「コマンドにもライブラリにもなる」構造になります。
テストコードや実行コードを分けるメリット

プログラムを書いていると、その場で動作確認をしたくなることがよくあります。
そのために、ファイルの末尾に簡単なテストコードを書くことは自然な流れです。
しかし、そのテストコードがimportしたときにも毎回実行されてしまうと、予期しない動作になってしまいます。
例えば、utils.pyに次のようなコードを書いたとします。
# utils.py
def add(a, b):
return a + b
# 動作確認のつもりで書いたコード
print(add(2, 3))
この状態で別ファイルから
import utils
とすると、importのタイミングでprint(add(2, 3))が実行されてしまい、意図しないタイミングで「5」が出力されることになります。
これを防ぐために、テストコードや実行用コードをif __name__ == "__main__":の中に入れます。
# utils.py
def add(a, b):
return a + b
if __name__ == "__main__":
# ここは直接実行したときだけ動く
print(add(2, 3))
こうすると
python utils.pyと直接実行したとき →5が表示される- 他のファイルから
import utilsしたとき → 何も表示されない
となり、テストコードと実際に再利用したいコードをきれいに分けることができます。
大規模Pythonプログラムでの役割

規模が大きくなると、1ファイルで完結せず、複数のファイルに分割して開発します。
このときif __name__ == "__main__":は、特に次の2つの役割を果たします。
1つ目はエントリーポイント(入口)を明確にすることです。
複雑なプロジェクトでも、最終的に「どこからプログラムがスタートするのか」を1箇所にまとめられます。
2つ目は各モジュールを「再利用可能な部品」として保つことです。
どのモジュールも、基本的には関数やクラスの定義に集中し、「実際に動かすコード」はメインスクリプトに集約することで、構造が分かりやすくなります。
大規模プロジェクトほど、この一行が「設計のルール」として重要になっていきます。
if __name__ == “__main__”の具体的な書き方
基本的な書き方とコード例

もっともシンプルなパターンは、ファイルの末尾に次のように書く形です。
# sample.py
def greet(name):
"""名前付きで挨拶する関数"""
print(f"Hello, {name}!")
# ここから実行用のコード
if __name__ == "__main__":
# このブロックの中は、直接実行されたときだけ動く
greet("Python")
このファイルを2通りの方法で使ってみましょう。
- 直接実行する場合
python sample.py
Hello, Python!
- 別ファイルからimportする場合
# use_sample.py
import sample
# sample.greetを呼び出して利用
sample.greet("World")
python use_sample.py
Hello, World!
このとき、use_sample.pyの実行時には「Hello, Python!」は表示されません。
なぜならsample.pyはimportされているだけなので、__name__には"sample"が入り、条件__name__ == "__main__"が偽になるからです。
main関数とif __name__ == “__main__”の組み合わせ

実務では、if __name__ == "__main__":の中に直接すべての処理を書くよりも、main()という関数を定義し、それを呼び出す形にすることが多いです。
# main_pattern.py
def main():
"""プログラム全体のメイン処理をまとめた関数"""
print("メイン処理を実行します")
# ここに本来の処理をまとめて書いていく
# 例: 入力の受付、計算処理、結果表示など
if __name__ == "__main__":
# ここでは「プログラムの入口」を示すだけにする
main()
このスタイルには次のようなメリットがあります。
- メイン処理が関数として切り出されるので、他のコードから
main()を直接呼び出してテストしやすい - ifブロックの中が短くて読みやすいため、「このファイルの入口はここだ」とすぐに分かる
- 同じプロジェクト内で
main()の形に統一すると、コードスタイルとしても整った印象になる
このため、「メイン関数 + if __name__ == “__main__”:」のセットは、Pythonの定番パターンといえます。
Pythonスクリプトをコマンドラインから実行する流れ

コマンドラインからPythonスクリプトを実行したときの全体像を、ざっくり追ってみます。
- ユーザーがターミナルで
のように入力するpython app.py - Pythonインタプリタが起動し、
app.pyを「メインスクリプト」として読み込む - 読み込み時に、
__name__が"__main__"に設定される - ファイルの先頭から順番に、関数定義やクラス定義などのコードが実行される
if __name__ == "__main__":の行に到達したとき、条件が真になるので、中のmain()などが呼び出される- メイン処理が実行され、プログラムが終了する
このような流れを意識しておくと、if __name__ == "__main__":が「実行の入口に位置するスイッチ」であることが見えてきます。
よくある疑問と注意点
if __name__ == “__main__”は必須か

結論として、Pythonファイルを書くたびに必ず必要というわけではありません。
ただし、次のような場合には書いておくのがおすすめです。
- そのファイルを他のファイルからもimportして使う可能性があるとき
- ファイルの末尾に、動作確認用や実行用のコードを書きたいとき
- 規模が中〜大きめのプロジェクトで、エントリーポイントを明確にしたいとき
逆に、小さなスクリプトで、他からimportする予定もなく、一度きりの使い捨てであれば、省略しても実害はない場合も多いです。
ただし、学習段階からif __name__ == "__main__":に慣れておくと、後で規模が大きくなったときに困りにくくなるため、練習として積極的に使っていくとよいです。
JupyterやVSCodeでの挙動の違い

開発環境によって、__name__の振る舞いが少し違って見えることがあります。
1つのサンプルコードで確認してみましょう。
# check_name.py
print("__name__は:", __name__)
if __name__ == "__main__":
print("これはメインとして実行されたときだけ表示されます")
このファイルを、いくつかの環境で実行してみます。
コマンドラインから実行する場合
python check_name.py
__name__は: __main__
これはメインとして実行されたときだけ表示されます
別ファイルからimportする場合
# import_check.py
import check_name
python import_check.py
__name__は: check_name
ここでは、if __name__ == "__main__":以下は実行されません。
Jupyter Notebookの場合
Jupyter Notebookのセルに同じ内容を書いた場合、多くの環境では、そのセルが「メイン扱い」となり、__name__は"__main__"のように振る舞います。
そのため、Notebook上では
__name__は: __main__
これはメインとして実行されたときだけ表示されます
のような結果になることが多いです。
ただし、Notebookは「セルごとに実行」される特殊な環境なので、通常のスクリプトとは読み込み方が違う点に注意が必要です。
VSCodeの場合
VSCodeでも、ターミナルに対してpython check_name.pyを実行すれば、コマンドラインと同じ挙動になります。
VSCodeの「デバッグ実行」機能でも、基本的には同様に__name__ == "__main__"が真になるように実行されます。
ただし、拡張機能や設定によって微妙な違いが出ることがあるため、気になる場合は上記のようなテストコードで確認してみると安心です。
import時に実行されたくない処理の書き方

「importしたときには実行してほしくないけれど、直接実行したときには動かしたい」というのが、まさにif __name__ == "__main__":の出番です。
典型的には、次のようなコードを避けるべきです。
# bad_example.py
# ファイルを読み込んだ瞬間に動いてしまう
print("プログラムを開始します")
# ここに大量の処理がベタ書きされている...
これを安全な形に直すには、処理を関数にまとめ、その関数をif __name__ == "__main__":の中から呼び出します。
# good_example.py
def run():
"""実際に動かしたい処理をまとめた関数"""
print("プログラムを開始します")
# ここに本来の処理を書く
# 例: 設定の読み込み、メインループの開始など
# 直接実行のときだけrun()を呼び出す
if __name__ == "__main__":
run()
こうしておけば
python good_example.pyと直接実行すると、run()が動くimport good_exampleとしても、何も実行されず、run関数だけが使える状態で読み込まれる
という、理想的な挙動になります。
「importしただけで勝手に処理が走らない」ようにすることは、モジュール設計の基本なので、習慣としてif __name__ == "__main__":で実行部分を囲うようにしておくとよいです。
まとめ
if __name__ == "__main__":は、Pythonが用意している__name__という特別な変数を使い、「このファイルがメインとして直接実行されたときだけ、ここから下を動かす」という条件を作るための仕組みです。
これにより、1つのファイルを「コマンド(実行用)」と「モジュール(部品)」の両方として扱えるようになり、テストコードや実行コードを安全に切り分けられます。
特に、関数やクラス定義はファイルの上部に書き、メイン処理はmain()関数にまとめ、それをif __name__ == "__main__":から呼び出す構成を身につけておくと、中規模以上のPython開発でも迷わずコードを書き進められるようになります。
