Pythonのif __name__ == '__main__' とは?エントリーポイントの基本と実践

python icon
Python

こんにちは、とまだです。

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 を中心に、プログラミング教育に情熱を注いでいます。初心者が楽しく学べる環境作りを目指しています。

著者の詳細を見る →