
파이썬 __name__ == ‘__main__’은 짧은 문장이지만 Python 입문자에게는 가장 이상해 보이는 관용구 중 하나입니다.
핵심은 이 파일이 프로그램의 시작점인지, 다른 파일에 의해 불러와진 모듈인지 구분하는 것입니다. 이 글은 Python 공식 문서를 기준으로 import와 직접 실행의 차이를 예제로 정리합니다.

파이썬 __name__ == ‘__main__’을 먼저 실행 흐름으로 보자
Python 파일은 직접 실행될 수도 있고, 다른 파일에서 import될 수도 있습니다. 두 상황에서 같은 최상위 코드가 모두 실행되면 예상하지 못한 출력, 파일 생성, 네트워크 호출이 일어날 수 있습니다.
def greet(name):
return f"Hello, {name}"
if __name__ == "__main__":
print(greet("bscodelab"))이 코드는 직접 실행하면 print가 동작합니다. 하지만 다른 파일에서 `greet`만 import하면 print는 실행되지 않습니다.
직접 실행과 import의 차이
터미널에서 `python hello.py`처럼 실행하면 그 파일은 프로그램의 시작점입니다. 이때 Python은 해당 실행 환경의 이름을 `__main__`으로 둡니다.
반대로 `import hello`처럼 불러오면 그 파일은 모듈입니다. 이때 `__name__`은 보통 파일 이름에서 온 모듈 이름이 됩니다.
- `python app.py`: app.py의 __name__은 ‘__main__’
- `import app`: app.py의 __name__은 ‘app’
- 그래서 같은 파일 안에서도 실행 전용 코드를 분리할 수 있다
main guard가 막아 주는 side effect
import는 함수와 클래스를 가져오는 일처럼 보이지만, 모듈 최상위 문장도 실행될 수 있습니다. 그래서 파일 최상위에 테스트 코드, print, 파일 삭제, API 호출을 그대로 두면 import하는 순간 부작용이 생깁니다.
# 나쁜 예: import만 해도 실행된다
data = load_big_file()
print("loaded")
def parse(data):
return data.strip()실행 전용 코드는 `main()` 함수로 모으고 main guard 아래에서 호출하는 편이 안전합니다.
테스트 가능한 코드 구조로 바꾸기
좋은 구조는 ‘계산하는 함수’와 ‘실행하는 코드’를 나눕니다. 함수는 import해서 테스트할 수 있고, 실제 실행은 main guard가 담당합니다.
def parse_args(argv):
return {"name": argv[1] if len(argv) > 1 else "world"}
def run(name):
return f"Hello, {name}"
if __name__ == "__main__":
import sys
args = parse_args(sys.argv)
print(run(args["name"]))이렇게 하면 `parse_args`와 `run`은 테스트에서 바로 import할 수 있고, 터미널 실행 동작은 따로 검증할 수 있습니다.
언제 꼭 써야 할까
- 파일을 스크립트처럼 직접 실행할 일이 있다
- 동시에 다른 파일에서 함수나 클래스를 import할 가능성이 있다
- 테스트 코드에서 모듈을 import해야 한다
- 실행 시 파일 입출력, 네트워크 호출, print 같은 side effect가 있다
- 나중에 CLI 구조로 확장할 가능성이 있다
정리
__name__를 이해할 때는 명령어나 패턴 이름만 외우기보다 그 도구가 해결하려는 경계를 먼저 보는 편이 좋습니다. 오늘 글의 기준은 화면과 데이터, 실행과 import, 정상 흐름과 오류 흐름, 정합성과 동시성, 개인 브랜치와 공유 브랜치를 나눠 보는 것입니다.
함께 보면 좋은 내부 글은 파이썬 isinstance는 언제 써야 할까, 파이썬 property는 왜 쓸까, 파이썬 list comprehension은 언제 읽기 어려워질까입니다. 외부 기준은 Python Docs – __main__, Python Docs – Modules, Python Docs – import system를 확인했습니다.