파이썬에서 if __name__ == '__main__':은 무슨 의미일까?
파이썬 인터프리터가 소스 파일을 읽으면, 파일 안에 포함된 모든 코드를 위에서부터 차례대로 실행합니다.
그런데 본격적으로 코드를 실행하기 전에, 인터프리터는 몇 가지 특수 변수(special variables)를 먼저 정의합니다. 그중 하나가 바로 __name__입니다.
- 직접 실행한 경우: 파이썬 인터프리터가 해당 모듈(소스 파일)을 메인 프로그램으로 실행하면,
__name__변수에 '__main__'이라는 값이 설정됩니다. - 임포트된 경우: 다른 모듈에서 이 파일을 가져와 사용하면,
__name__에는 모듈 자신의 이름(파일명)이 설정됩니다.
이 패턴이 필요한 이유
개발자가 작성한 모듈(.py 파일)은 두 가지 방식으로 사용될 수 있습니다. 터미널에서 직접 실행할 수도 있고, 다른 모듈에서 import 하여 함수나 클래스를 재사용할 수도 있습니다.
if __name__ == '__main__': 조건문을 활용하면 다음과 같은 장점이 있습니다.
- 모듈을 프로그램으로 직접 실행할 때만 원하는 코드(메인 로직, 테스트 코드 등)를 실행할 수 있습니다.
- 누군가 단순히 모듈을 임포트해서 함수를 호출하는 경우에는 불필요한 코드가 실행되지 않습니다.
예제로 살펴보기
one.py와 two.py라는 두 개의 파일이 있다고 가정해 보겠습니다.
one.py
def func():
print('func() 함수가 one.py에서 호출되었습니다')
print('one.py의 최상위 코드 실행')
if __name__ == '__main__':
print('one.py가 직접 실행되었습니다')
else:
print('one.py가 다른 모듈에서 임포트되었습니다')
two.py
import one
print('two.py의 최상위 코드 실행')
one.func()
if __name__ == '__main__':
print('two.py가 직접 실행되었습니다')
else:
print('two.py가 다른 모듈에서 임포트되었습니다')
실행 결과 비교
먼저 one.py를 직접 실행해 보겠습니다.
$ python one.py
출력 결과는 다음과 같습니다.
one.py의 최상위 코드 실행 one.py가 직접 실행되었습니다
이번에는 two.py를 실행해 보겠습니다.
$ python two.py
출력 결과는 다음과 같습니다.
one.py의 최상위 코드 실행 one.py가 다른 모듈에서 임포트되었습니다 two.py의 최상위 코드 실행 func() 함수가 one.py에서 호출되었습니다 two.py가 직접 실행되었습니다
출력 결과에서 알 수 있듯이, two.py를 실행하면 import 문에 의해 one.py의 최상위 코드가 먼저 실행되지만, one.py의 if __name__ == '__main__': 블록 안에 있는 코드는 건너뛰어집니다. 이는 one.py가 '직접 실행'된 것이 아니라 '임포트'되었기 때문입니다.
핵심 정리
- 파이썬은 코드를 실행하기 전에
__name__같은 특수 변수를 정의합니다. - 파일을 직접 실행하면
__name__은 '__main__'이 되고, 임포트되면 모듈 이름이 됩니다. - 이 차이를 활용하면 스크립트로 실행될 때만 동작하는 코드를 깔끔하게 분리할 수 있으며, 재사용 가능한 모듈을 작성하는 파이썬의 표준적인 관례(idiom)로 널리 사용됩니다.