본문 바로가기
coding 📟/python 💻

[Python] __name__ 변수 __main__ 이란

by 고돌한 데이터 사이언스 2022. 5. 24.
반응형

 

파이썬으로 프로젝트를 구성하고 

열심히 그 안에 패키지와 모듈을 구성한 후

실행을 해보면 아래와 같은 에러를 마주치는 경우가 종종있다.

 

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

 

[Python] 파이썬이 모듈과 패키지를 찾는 방법 ModuleNotFoundError

ModuleNotFoundError 의 원인과 에러방지를 위해 기초를 다시 정리하고자 생각했고, 지난 글에 python __name__ 변수와 '__main__'의 의미를 정리하였다. 아래 글을 참고하자. 2022.05.24 - [coding 📟/python 💻..

kodorricoding.tistory.com


 
 

 

반응형

댓글