파이썬으로 프로젝트를 구성하고
열심히 그 안에 패키지와 모듈을 구성한 후
실행을 해보면 아래와 같은 에러를 마주치는 경우가 종종있다.
modulenotfounderror: no module named ''
이런 경우는 파이썬 인터프리터에서 import 한 모듈이나 패키지를 찾을 시 찾지 못하여 발생하는 에러로,
발생할때마다 구글링을 통해 해결하거나 sys 모듈의 path에 패키지의 경로를 추가하여
급급하게 처리를 했다.
하지만 매번 그렇게 할 순 없는일!
이번 기회를 통해 에러가 발생한 원인을 파악하고 방지하는 법을 제대로 숙지하고자 글을 정리하기로 했다.
이번에는 모듈의 시작점이 되는 __name__ 변수와 '__main__' 에 대해 정리하고자 한다.
if __name__ == '__main__':
# 모듈의 시작점
파이썬 코드를 작성 시 위와 같은 코드로 시작하는 부분을 접하게 된다.
이 코드를 사용하는 이유는 무엇일까.
결론적으로 이 코드는 현재 스크립트 파일(.py)이 실행되는 상태를 파악하기 위해 사용한다.
먼저 앞부분의 __name__ 부터 살펴보자
__name__ 이란?
파이썬 .py 스크립트에 숨겨져 있는 변수이다.
이 변수는 해당 모듈의 이름을 가지고 있는 변수이다.
즉, 지금 스크립트 파일의 이름을 가지고 있는 변수라는 뜻이다.
예를 들어 test.py 면 __name__ 변수는 test라는 문자열을 담고 있다.
그럼 아래의 코드를 살펴보자
#hello.py
print('hello 모듈 시작')
print('hello.py __name__:', __name__) # __name__ 변수 출력
print('hello 모듈 끝')
#main.py
import hello # hello 모듈을 가져옴
print('main.py __name__:', __name__) # __name__ 변수 출력
출력 ------------------------------------------------------
hello 모듈 시작
hello.py __name__: hello # hello.py의 __name__ 변수
hello 모듈 끝
main.py __name__: __main__
파이썬에서 import로 해당 모듈을 가져오면 해당 스크립트 파일이 한 번 실행된다.
따라서 main.py를 실행하면 위의 hello 모듈이 실행이 된다.
결과적으로
hello.py의 __name__ 변수에는 'hello' 라는 문자열이 들어가고
main.py의 __name__ 변수에는 '__main__'이 들어간다.
그럼 여기서 드는 의문
왜 main.py 의 __name__ 변수는 'main'이 아닌 '__main__' 값을 가지고 있을까?
그 이유는 메인으로 직접 실행한 스크립트의 경우에는
__name__에 파일 이름이 아닌 '__main__'이라는 문자열이 들어가게 된다.
메인으로 직접 실행한 파일이라는 것을 구분하기 위함이다.
만약 main.py 가 아닌 test.py 라는 이름으로 스크립트를 생성 후 메인으로 실행하면
__name__ 변수값은 'test' 가 아닌 '__main__' 값을 가지고 있다.
위에 메인으로 직접 실행한 파일이라는 것을 구분하기 위함이다. 라고 했는데
예제를 통해 조금 더 깊이 알아보자
# x.py
import y
result = y.getSum(8, 9, 10)
print(f"y.getSum(8, 9, 10) : {result}")
# y.py
def getSum(a, b, c):
return a + b + c
if __name__ == "__main__":
result = getSum(1, 2, 3)
print(f"getSum(1, 2, 3) : {result}")
1) x.py 를 메인으로 프로그램 실행
import y 즉 y를 임포트 했으므로 해당 y 스크립트 파일이 한 번 실행된다.
하지만 y.py 실행시 해당 y의 __name__ 값은 'y'이고
아래 if __name__ == "__main__": 조건문에 의해 해당 print 문은 실행되지 않게 된다.
2) y.py 를 메인으로 프로그램 실행
y 스크립트 파일이 메인으로 실행됐기 떄문에 __name__ 값은 '__main__'값이 될것이고
아래 if __name__ == "__main__": 조건문을 만족
해당 print 문은 실행된다.
이런 식으로 해당 스크립트를 메인으로 쓸때, import 모듈로 사용될 때를 구분하기 위해
if __name__ == "__main__" 을 이용해서 사용한다.
정리하며
직접 실행된 파일 __name__ == "__main__"
임포트 돼서 모듈로 사용된 .py 파일 __name__ == "모듈이름"
이는 곧
어떤 스크립트 파일이든 파이썬 인터프리터가 최초로 실행한 스크립트 파일의
__name__ 변수에는 '__main__'값이 들어간다.
이는 곧 프로그램의 시작점(entry point)라는 뜻이다.
이렇게 모듈의 시작점에 대해서 정리해보았다.
다음글은 파이썬이 패키지와 모듈을 찾는 방법에 대해 정리하였다.
아래의 게시글을 참고하자.
2022.05.24 - [coding 📟/python 💻] - [Python] 파이썬이 모듈과 패키지를 찾는 방법 ModuleNotFoundError
'coding 📟 > python 💻' 카테고리의 다른 글
[Python] map 함수 (0) | 2023.08.20 |
---|---|
[Python] 파이썬이 모듈과 패키지를 찾는 방법 ModuleNotFoundError (0) | 2022.05.24 |
[Python] 딕셔너리 컴프리헨션 + 집합, 제너레이터 컴프리헨션 (0) | 2022.05.20 |
[Python] 리스트 컴프리헨션 List Comprension (if else) (0) | 2022.05.20 |
[Python] 가상환경 pyenv windows 윈도우 설치 사용법 (1) | 2022.05.13 |
댓글