Python 스크립트를 작성할 때 흔히 접하게 되는 if __name__ == '__main__' 구문은 많은 초보자들이 혼동하는 부분 중 하나입니다. 이 조건문이 어떤 의미를 가지며 언제 사용해야 하는지 자세히 알아보겠습니다.
모듈과 실행 진입점의 개념
C나 Java와 같은 언어에서는 프로그램 시작 지점을 명확하게 정의된 main 함수나 메서드로 표현합니다. 하지만 Python은 스크립트 언어로서 파일의 첫 줄부터 순차적으로 코드를 해석하고 실행하기 때문에 특별한 진입점이 필요하지 않습니다.
그러나 실제 개발에서는 하나의 Python 파일이 단독 실행 목적일 수도 있고, 다른 모듈에서 재사용 가능한 라이브러리 역할을 할 수도 있습니다. 이런 상황에서 특정 코드가 모듈로서 불러와질 때는 실행되지 않도록 하고 싶은 경우가 생깁니다.
조건부 실행 예제
예를 들어 다음과 같은 설정 파일 config.py가 있다고 가정해봅시다:
DATABASE_URL = "sqlite:///app.db"
DEBUG_MODE = True
def test_config():
print(f"Database: {DATABASE_URL}")
print(f"Debug: {DEBUG_MODE}")
test_config()
이 파일을 직접 실행하면 설정 값들을 확인할 수 있지만, 다른 파일에서 from config import DATABASE_URL 형식으로 가져올 때도 test_config() 함수가 호출되어 원치 않는 출력이 발생합니다.
이 문제를 해결하기 위해 다음과 같이 수정할 수 있습니다:
DATABASE_URL = "sqlite:///app.db"
DEBUG_MODE = True
def validate_settings():
print(f"Database: {DATABASE_URL}")
print(f"Debug: {DEBUG_MODE}")
if __name__ == "__main__":
validate_settings()
이제 config.py를 직접 실행했을 때만 validate_settings() 함수가 동작하며, 모듈로써 임포트될 때는 해당 부분이 무시됩니다.
__name__ 변수의 동작 원리
Python에서 모든 모듈은 __name__이라는 내장 변수를 가지고 있으며, 이 변수는 현재 모듈이 어떻게 실행되는지에 따라 다른 값을 갖습니다:
- 직접 실행되는 경우:
__name__값은 문자열"__main__"이 됩니다. - 다른 모듈에 의해 임포트되는 경우:
__name__값은 해당 모듈의 이름(예: "mypackage.mymodule")이 됩니다.
다음 예제를 통해 확인해볼 수 있습니다:
# sample_module.py
print("Module name:", __name__)
if __name__ == "__main__":
print("This module is executed directly")
else:
print("This module is imported")
직접 실행 시(python sample_module.py):
Module name: __main__
This module is executed directly
임포트 시(import sample_module):
Module name: sample_module
This module is imported
패키지 진입점과 -m 옵션
Python에서는 디렉토리 형태의 패키지를 실행 가능한 형태로 만들기 위해 __main__.py 파일을 사용할 수 있습니다. 이 파일은 python -m package_name 명령어를 통해 패키지를 직접 실행할 때 호출됩니다.
예를 들어 아래와 같은 구조를 생각해봅시다:
myapp/
├── __init__.py
├── core.py
└── __main__.py
__main__.py 내용:
from .core import start_application
if __name__ == "__main__":
start_application()
이제 python -m myapp 명령어로 전체 애플리케이션을 시작할 수 있게 됩니다. 이 방식은 표준 라이브러리나 서드파티 패키지들에서도 널리 사용되고 있습니다.
일반적인 Python 파일 실행(python script.py)과 모듈 방식 실행(python -m script)의 차이점은 sys.path에 영향을 미치는 경로가 다르다는 점입니다. 전자는 스크립트 파일이 위치한 디렉토리를 포함하고, 후자는 현재 작업 디렉토리를 포함합니다.