#2 of python - if __name__ == "__main__" 의 의미

"__name__ and __main__" at python

개요

1
2
if __name__ == "__main__":
    # 함수 실행 등 로직 작성
cs
  • 개별 모듈 (.py 로 생성된 각 python file) 에 위 로직이 하단에 추가되는 이유
    • 해당 모듈 직접 실행 or 다른 모듈에서 import 해서 사용한 것인지 구분을 위해
    • 구분이유
1
2
3
4
def sum(a,b):
    print(a+b)
 
sum(1,2)
cs

위와 같은 로직이 작성된 모듈이 있을 때,
  • 해당 모듈을 다른 모듈에서 import 하기만해도 sum(1,2) 가 실행되는 이슈 발생
    • 기본적으로 import 하면서 모듈을 1회 실행하게 됨
1
2
3
4
5
6
7
def sum(a,b):
    print(a+b)
 
sum(1,2)
 
if __name__ == "__main__":
    sum(1,2)
cs

하단에 위와같이 로직을 추가해주면, 실행 주체에 따라 불필요한 로직 실행을 방지할 수 있음
  • 즉, __name__ = 모듈 이름 저장
    • 해당 모듈 직접 실행
      • "__main__" 세팅
      • 직접 실행 케이스
        • 표준 입력
        • 스크립트 및 CLI 환경에서 읽힐 때
    • 다른 모듈에서 import
      • "해당 모듈명" 세팅
        • ex) import mod -> 해당 모듈을 호출한 곳에서 print(__name__)
        • 출력결과 = "mod"
    • 특정 모듈이 어떻게 실행되었는지를 구분하는 것 = 시작점 (entry point)
    • java 에서 클래스 파일 생성 시, 자동으로 main 함수가 생성되는 것과 동일 개념

when  패키지 범위

패키지의 경우, __main__.py 모듈을 추가하면 동일한 효과 얻을 수 있음
    • 즉, 최상위 홈 디렉토리 바로 아래에 __main__.py 생성
      • CLI 환경에서 실행 가능 -> __main__ 으로 모듈명이 세팅됨
      • 최상위 홈 디렉토리에 위치한 __main__.py 인식 가능

응용개념

  • __main__.py 에서 하위 패키지 내 모듈을 import 및 사용하려면
    • 해당 패키지 내 __init__.py 에 모듈 명시 for __main__.py 에서의 접근허용
1
2
3
4
# write down module(.py) / class / function list to be called at other modules
 
from .chrome import do_chrome_crawling
from .naver import do_naver_crawling
cs

  • 아래와 같이 __main__.py 에서 위에 명시된 모듈들 import 해서 사용 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
import test.v1.bing
import test.v1.unsplash
import test.v2.chrome
import test.v2.naver
 
if __name__ == "__main__":
    # version 1
    test.v1.do_bing_crawling()
    test.v1.do_unsplash_crawling()
 
    # version 2
    test.v2.do_chrome_crawling()
    test.v2.do_naver_crawling()
cs



References




댓글