본문 바로가기
코딩/Python

if __name__ == "__main__"은 왜 쓰는 걸까?

by 나홀로코더 2021. 12. 27.
반응형

파이썬을 배워가다 보면 각종 튜토리얼에서 보여주는 파이썬 스크립트, 또는 어딘가에서 긁어 온 예제 스크립트, 각종 라이브러리의 소스 파일들 모두에서 자주 보이는 if문이 있다.

 

대부분의 파이썬 스크립트들이 아래와 같은 형태를 띠고 있는데, 필자는 이에 대해 모르고 처음 접했을 때 무슨 뜻인지 도무지 짐작조차 되지 않았던 기억이 있다.

 

import ...

def functionname():
	...
    
def functionname2():
	...

def main():
	functionname()
	functionname2()

if __name__ == "__main__":
	main()

 

if __name__ == "__main__" 부분을 이해하기 쉽게 말로 표현하자면, "이 파이썬 스크립트가 직접 실행될 때에는 main() 함수를 실행하라"는 뜻이다.

 

파이썬 스크립트가 직접 실행되지 않을 때는 무엇을 말하는가? 자주 보았겠지만, 다른 스크립트에서 import되는 경우이다.

 

따라서 위 말을 조금 바꿔 말하면, "이 파이썬 스크립트가 직접 실행될 때에만 main() 함수를 실행하고, 다른 스크립트에서 import될 때에는 실행하지 말라"는 뜻이다.

 

반응형

 

일단 위의 if문이 왜 저런 뜻이 되는지부터 보자.

 

아마 파이썬 코드를 짜면서 __name__이라는 변수를 선언해본 적은 없을 것이다. 그러나 따로 선언하지 않더라도 파이썬 스크립트를 직접 실행하거나 import할 때에는 자동으로 __name__ 변수가 선언된다.

 

위의 if문은 이러한 사실에 따라 만들어지는 것인데, 파이썬 스크립트가 직접 실행될 때에는 __name__ 변수가 "__main__"이 된다. 그렇기 때문에 if __name__ == "__main__" 이라는 구문이 "이 스크립트가 직접 실행될 때에는..."이 되는 것이다.

 

그렇다면 다른 스크립트에서 import될 때에는 __name__변수가 무엇이 될까? 

 

어쩌면 당연하게도, 해당 스크립트의 파일명이 __name__변수가 된다.

 

이에 대해 간단히 확인해보자.

 

example.py 파일에 print(__name__)만 입력한 다음에 해당 파일을 실행해보면 __main__이 출력될 것이다. 파일을 만들지 않고 터미널에서 python을 입력해 대화형 모드로 진입한 다음에 위 코드를 입력해도 결과는 같다.

 

이번에는 위 example.py를 다른 스크립트에서 import한 다음에 print(example.__name__)을 입력하고, 해당 파일을 실행해보면 example이 출력될 것이다.

 

솔직히 필자는 모듈을 따로 만들고 다른 데에서 import해야할 정도로 복잡한 프로그램을 만들지 않기 때문에, 이와 같은 if문은 거의 사용하고 있지 않다.

 

아마 이 글을 찾아 보고 있는 독자도 마찬가지일 것이다.

 

그래도 언젠가는 모듈을 만들고, 패키지를 만들어야 하는 때가 올지도 모르니 일단 알아두고 넘어가면 좋을 것이다.

반응형

댓글