Pythonのif __name__ == '__main__' とは?エントリーポイントの基本と実践
こんにちは、とまだです。
Pythonを書いていて、こんな疑問を持ったことはありませんか?
「if __name__ == '__main__'
って何?」
「mainって関数を作る必要があるの?」
今回は現役のエンジニア、そして元プログラミングスクール講師としての経験から、Pythonのエントリーポイントについて解説します。
そもそもエントリーポイントって何?
エントリーポイントは、プログラムが始まる場所のことです。
日常生活で例えるなら、建物の入り口みたいなものです。 どこから入るか決まっていれば、迷わずに済みますよね。
Pythonの場合、この入り口を明確にする仕組みが if __name__ == "__main__":
なのです。
なぜ必要なの?
Pythonファイルには2つの使い方があります。
1つ目は、直接実行する方法。 2つ目は、他のファイルからインポートする方法。
この2つを区別しないと、困ったことが起きます。
例えば、計算用の関数を作ったとしましょう。 他のファイルから使いたいだけなのに、インポートした瞬間に計算が始まってしまったら困りますよね。
そこで if __name__ == "__main__":
の出番です。
基本的な書き方
まずはシンプルな例から見てみましょう。
def greet():
print("こんにちは!")
def main():
print("プログラムを開始します")
greet()
if __name__ == "__main__":
main()
このコードのポイントは、最後の2行です。 「このファイルが直接実行されたときだけ、main()を呼び出す」という意味になります。
__name__
の正体
__name__
は、Pythonが自動で用意してくれる特殊な変数です。
ファイルを直接実行すると、__name__
には "__main__"
という文字列が入ります。
一方、他のファイルからインポートすると、ファイル名が入ります。
この仕組みを使って、実行方法を判断しているのです。
実際に動かしてみよう
sample.py
というファイルを作ってみましょう。
def calculate(a, b):
return a + b
def main():
result = calculate(10, 20)
print(f"計算結果: {result}")
if __name__ == "__main__":
main()
このファイルを実行すると「計算結果: 30」と表示されます。
でも、別のファイルから使うときはどうでしょう?
import sample
# calculate関数だけを使える
answer = sample.calculate(5, 3)
print(answer) # 8と表示される
インポートしても、勝手に「計算結果: 30」は表示されません。
これが if __name__ == "__main__":
の便利なところです。
複数ファイルでの活用
実際の開発では、機能ごとにファイルを分けることが多いです。
プロジェクトの構成例:
project/
├── main.py
└── utils.py
utils.py(便利な関数をまとめたファイル):
def format_message(name):
return f"ようこそ、{name}さん!"
main.py(メインの処理を書くファイル):
import utils
def main():
message = utils.format_message("Python初心者")
print(message)
if __name__ == "__main__":
main()
こうすることで、役割が明確になります。 utils.pyは道具箱、main.pyは実際の作業場、という感じです。
よくある失敗パターン
初心者がつまずきやすいポイントを紹介します。
パターン1:mainを呼び忘れる
def main():
print("実行されない...")
# if __name__ == "__main__": を書き忘れている
main関数を定義しただけでは、何も起きません。 必ず呼び出しが必要です。
パターン2:インデントを間違える
if __name__ == "__main__":
main() # インデントがない!
Pythonはインデントが重要です。 必ず4つのスペースでインデントしましょう。
実践的な使い方
コマンドライン引数を受け取る例を見てみましょう。
import sys
def main():
# 引数の数をチェック
if len(sys.argv) < 2:
print("使い方: python script.py [名前]")
return
name = sys.argv[1]
print(f"こんにちは、{name}さん!")
if __name__ == "__main__":
main()
このスクリプトは python script.py 太郎
のように実行できます。
エラー処理も忘れずに
実務では、エラー処理も重要です。
def main():
try:
# メインの処理
result = 10 / 0 # わざとエラーを起こす
except ZeroDivisionError:
print("0で割ることはできません")
return 1 # エラーコードを返す
return 0 # 正常終了
if __name__ == "__main__":
exit_code = main()
exit(exit_code)
エラーが起きても、プログラムが突然終了しないようにできます。
大規模プロジェクトでの活用
プロジェクトが大きくなると、さらに工夫が必要です。
ファイル構成の例:
app/
├── main.py
├── database.py
├── api.py
└── config.py
main.pyでは、各モジュールを組み合わせます。
import database
import api
import config
def main():
# 設定を読み込む
settings = config.load_settings()
# データベースに接続
db = database.connect(settings)
# APIサーバーを起動
api.start_server(db, settings)
if __name__ == "__main__":
main()
各ファイルが独立した役割を持つことで、管理しやすくなります。
テストしやすいコードを書く
main関数を分離すると、テストも書きやすくなります。
def add_numbers(a, b):
return a + b
def main():
result = add_numbers(5, 3)
print(f"結果: {result}")
if __name__ == "__main__":
main()
テストファイルでは、main関数を呼ばずに個別の関数をテストできます。
import unittest
from mymodule import add_numbers
class TestAddNumbers(unittest.TestCase):
def test_add(self):
self.assertEqual(add_numbers(2, 3), 5)
パッケージとして配布する場合
Pythonパッケージを作る場合は、__main__.py
という特殊なファイルを使います。
mypackage/
├── __init__.py
└── __main__.py
こうすると、python -m mypackage
で実行できるようになります。
まとめ
if __name__ == "__main__":
は、Pythonの重要な仕組みです。
主なメリット:
- スクリプトとモジュールの両方で使える
- テストがしやすくなる
- コードの再利用性が高まる
- プロジェクトの構造が明確になる
最初は慣れないかもしれません。 でも、この書き方を身につけると、より整理されたコードが書けるようになります。
小さなスクリプトから始めて、徐々に大きなプロジェクトに挑戦してみてください。 きっと、この仕組みの便利さを実感できるはずです。
著者について

とまだ
フルスタックエンジニア
Learning Next の創設者。Ruby on Rails と React を中心に、プログラミング教育に情熱を注いでいます。初心者が楽しく学べる環境作りを目指しています。
著者の詳細を見る →