본문 바로가기
파이썬/자주하는 질문

파이썬(Python) if __name__ == '__main__': 은 무엇일까?

by J-Build 2020. 9. 11.

파이썬 인터프리터는 파이썬 스크립트가 실행될 때 __name__ 과 같은 스페셜한 변수들에게 값을 할당합니다.

 

아래와 같은 my_module.py 라는 스크립트를 작성해 볼께요. 

# my_module.py

def my_name():
    print('J Builder')
    
if __name__ == '__main__':
    my_name()

 

이 스크립트를 파이썬 인터프리터가 실행을 하면 __name__ 변수에 '__main__' 이라는 문자열값이 할당이 됩니다. 

➜  python_test python my_module.py   
J Builder

 

그럼 질문이 하나 생길텐데요. 아래 test_module.py처럼 그냥 if __name__ == '__main__': 구문 없이 my_name() 함수를 호출하면 안될까요? 

# test_module.py

def print_name():
    print('Test')
    
print_name()

 

답은, 당연히 됩니다.

➜  python_test python test_module.py 
Test

 

그럼 왜 if __name__ == '__main__': 구문을 사용하는 것일까요? 

 

그것은 어떤 스크립트가 다른 스크립트의 모듈로 import 될 때 필요하기 때문입니다.

예를 들어서 아래처럼 your_module.py 가 있다고 해볼께요. 그리고 my_module.py를 import 해보겠습니다. 

# your_module.py

from my_module import my_name

def your_name():
    print('Awesome')
    
if __name__ == '__main__':
    your_name()
    my_name()

 

이 스크립트를 실행하면 의도한대로 your_name()이 호출되고 my_name()이 호출이 됩니다. 

➜  python_test python your_module.py 
Awesome
J Builder

 

하지만 if __name__ == '__main__': 구문이 없었던 test_module.py를 import하면 어떻게 될까요? 

# your_module2.py

from test_module import print_name

def your_name():
    print('Awesome')
    
if __name__ == '__main__':
    your_name()
    print_name()

 

결과는 의도한 바와 다르게 print_name()이 두번 호출되었습니다. 즉, test_module을 import할 때 test_module.py의 마지막에 적었던 print_name()이 호출이 된것입니다. 

➜  python_test python your_module2.py 
Test
Awesome
Test

 

즉, 스크립트를 실행할 때는 수행이 되지만 다른 스크립트에서 import 될 때는 수행이 안되길 원하는 코드를 if __name__ == '__main__': 블럭안에 작성하여 사용할 수 있습니다.

 

 

댓글