if __name__ == "__main__": 이건 어떻게 작동하나? (Python)
안녕하세요. software 모르는 쌩양파 입니다.
AI 를 이용하여 Python 프로그램을 만들고 있는 초짜 입니다. AI 가 코드를 짜주긴 하는데, 궁금한 것들이 계속 생겨서, 공부를 어쩔수없이(?) 하게 되네요..ㅋ
if __name__ == "__main__": (이거 뭔가요?)
if __name__ == "__main__": 이 마법의 문장은 언제 실행될까요?
파이썬 코드를 보다 보면 자주 등장하는 if __name__ == "__main__": 이라는 조건문이 있습니다. 이 조건문 안에 있는 코드는 해당 파이썬 파일이 직접 실행될 때만 작동합니다.
조금 더 자세히 설명해 드릴게요.
파이썬 인터프리터는 코드를 실행하기 전에 몇 가지 특별한 내부 변수를 설정합니다. 그중 하나가 바로 __name__ 이라는 변수입니다.
1. 파일이 직접 실행될 때:
- 명령줄에서 python my_script.py 와 같이 파일을 직접 실행하면, 파이썬 인터프리터는 해당 파일의 __name__ 변수에 "__main__" (문자열)이라는 값을 할당합니다.
- 따라서 if __name__ == "__main__": 조건문은 True 가 되고, 이 조건문 아래에 있는 코드 블록이 실행됩니다.
2. 파일이 모듈로서 다른 파일에서 임포트(import)될 때:
- 예를 들어, another_script.py 라는 파일에서 import my_script 와 같이 my_script.py 파일을 모듈로서 가져와 사용한다고 가정해 봅시다.
- 이 경우, my_script.py 파일 내부에서 __name__ 변수는 "__main__" 이 아니라 해당 모듈의 이름 (즉, 파일 이름에서 .py를 뺀 "my_script") 으로 설정됩니다.
- 따라서 if __name__ == "__main__": 조건문은 False 가 되고, 이 조건문 아래의 코드 블록은 실행되지 않습니다.
왜 이런 방식을 사용할까요?
이러한 방식은 주로 다음과 같은 두 가지 목적을 위해 사용됩니다.
- 모듈로서의 기능과 직접 실행 기능 분리:
- 하나의 파이썬 파일이 다른 프로그램에서는 유용한 함수나 클래스를 제공하는 모듈로 사용될 수 있고, 동시에 그 파일 자체를 직접 실행하여 특정 작업을 수행하도록 만들고 싶을 때 유용합니다.
- 예를 들어, 어떤 계산 기능을 하는 함수들을 모아둔 파일이 있다고 할 때, 다른 파일에서는 이 함수들을 import 해서 사용하고, 이 파일을 직접 실행하면 해당 함수들을 테스트하는 코드가 돌아가도록 할 수 있습니다.
- 스크립트의 주요 실행 부분 명시:
- if __name__ == "__main__": 블록 안에 있는 코드가 해당 스크립트의 주된 실행 로직임을 명확하게 나타내는 역할을 합니다. 다른 사람이 코드를 볼 때 "아, 이 파일을 직접 실행하면 이 부분이 돌아가는구나" 하고 쉽게 이해할 수 있습니다.
간단한 예시:
# my_module.py
def useful_function():
print("useful_function()이 호출되었습니다.")
print(f"my_module.py의 __name__: {__name__}") # 모듈이 임포트될 때도 이 부분은 실행됩니다.
if __name__ == "__main__":
print("my_module.py가 직접 실행되었습니다.")
useful_function()
# main_script.py
import my_module
print("main_script.py를 실행합니다.")
my_module.useful_function()
실행 결과:
- python my_module.py 를 직접 실행했을 때:
-
my_module.py의 __name__: __main__ my_module.py가 직접 실행되었습니다. useful_function()이 호출되었습니다.
- python main_script.py 를 실행했을 때 (my_module.py가 임포트됨):
-
my_module.py의 __name__: my_module <-- __main__이 아닙니다! main_script.py를 실행합니다. useful_function()이 호출되었습니다.
위 예시에서 볼 수 있듯이, my_module.py를 직접 실행하면 if __name__ == "__main__": 안의 코드가 실행되지만, main_script.py에서 임포트될 때는 실행되지 않는 것을 확인할 수 있습니다. 다만, if 블록 밖에 있는 print(f"my_module.py의 __name__: {__name__}")는 임포트될 때도 한 번 실행됩니다. 모듈이 처음 임포트될 때 해당 모듈의 코드가 한 번 쭉 실행되기 때문입니다.
따라서 if __name__ == "__main__":은 내가 만든 파이썬 파일이 "프로그램의 시작점으로서 실행될 때"만 특정 코드를 동작시키고 싶을 때 사용하는 매우 유용한 관용구입니다.
결론 :
코드내에 if_name_=="_main_" : 이 있으면, 이거 아래 부분이 먼저 실행되고, 그 다음 코드의 맨 위로 가서 다른 것들이 순차적으로 실행됨. 다른 코드에서 불러서 사용될 때는 if_name_=="_main_" 은 실행되지 않음.
아하~ ^^ㅋㅋ