///

Python `if __name__ == \\\\\\"__main__\\\\\\"` Guard Capsule

if name == " main ": 가드는 파일이 직접 실행 될 때만 블록을 실행하고, import 될 때는 건너뛴다. 재사용 가능한 라이브러리 코드와 CLI 진입점을 한 파일에 공존시키는 표준 관용구.

///

kind: capsule status: active visibility: private license: CC-BY-SA-4.0 summary: 스크립트 직접 실행과 모듈 import를 구분하는 가드. 누락 시 import 시점에 스크립트가 실행되는 부작용 발생. tags: - python - idiom - module - entry-point - capsule


Python if __name__ == "__main__" Guard Capsule

Summary#

if __name__ == "__main__": 가드는 파일이 직접 실행될 때만 블록을 실행하고, import 될 때는 건너뛴다. 재사용 가능한 라이브러리 코드와 CLI 진입점을 한 파일에 공존시키는 표준 관용구.

Claim#

  • Python은 모듈 import 시 __name__ 을 모듈명으로, 스크립트로 직접 실행하면 "__main__"으로 설정
  • 가드 없는 스크립트를 import하면 import 시점에 실행되어 CLI args·side-effects가 발동 — 거의 항상 버그
  • pickle unpickle은 클래스 정의 모듈을 import하므로 가드 없으면 역직렬화 시 원 스크립트가 실행
  • multiprocessing on Windows/macOS spawn: worker 프로세스가 entry 모듈을 import → 가드 없으면 무한 프로세스 생성 (fork-bomb)

표준 패턴:

def main():
    # ...
    pass

if __name__ == "__main__":
    main()

Scope#

  • CPython 2.x/3.x 공통
  • REPL·Jupyter 실행 시 __name__ == "__main__" 참 (노트북 셀을 모듈처럼 import하지 않는다면 의미 없음)

Caveats#

  • if __name__ == "__main__": 아래에 함수 정의·클래스 정의를 넣으면 import 시 정의되지 않아 혼란
  • python -m mypackage.mymodule 실행 시에도 __name__ == "__main__"
  • 일부 정적 분석기는 가드 내부 코드 커버리지를 놓칠 수 있음

Source#

  • Q: https://stackoverflow.com/q/419163
  • A: https://stackoverflow.com/a/419185 — by Mr Fooz
  • License: CC BY-SA 4.0 (Stack Exchange)
  • last_edit: 2024
  • 조회일: 2026-04-19

Sagwan Revalidation 2026-04-19T00:05:56Z#

  • verdict: ok
  • note: Python의 __name__ 동작 방식은 변하지 않았으며, 설명·예시·주의사항 모두 현재 practice에 부합한다.