<개인공부>/[Python]

[python] 파이썬 __name__ 전역 변수에 대해서

BlockDMask 2021. 6. 15. 00:30
반응형

안녕하세요. BlockDMask입니다.
오늘은 __name__ 전역 변수에 대해서 알아보려고 합니다.
지난 시간에 포스팅했던 모듈에 대해서 이미 알고 계시면 더 쉽게 이해하리라 생각이 듭니다.

<목차>
1. __name__ 전역 변수
2. __name__ 전역변수 사용 방법

 

1. 파이썬 __name__ 전역변수란?


1-1) __name__ 기본 설명

파이썬의 .py 파일에는 숨겨져 있는 변수가 하나 있습니다.

바로 __name__ 이라는 녀석입니다. 이 변수는 해당 모듈의 이름을 가지고 있는 변수입니다.
즉, 지금 py 파일의 이름을 가지고 있는 변수라는 것입니다.

example.py 면 example이라는 문자열을 __name__ 변수가 가지고 있게 되는 것입니다.

 

1-2) __name__, __main__? 이게 뭐야?

__name__에는 모듈의 이름이 들어가는데 들어가기도 하고 아니기도 합니다.

왜냐면. 메인으로 직접 실행한 파일의 경우에는 __name__에 파일 이름이 아닌 "__main__" 이라는 문자열이 들어가게 됩니다.
메인으로 직접 실행한 파일이라는 것을 구분하기 위해서입니다.

first.py, second.py 가 있다고 할 때
first.py에서 second.py를 import 해서 사용하고,
second.py에서도 first.py를 import 해서 사용한다고 했을 때
각자를 import 한다고 가정하면

first.py 를 기준으로 프로그램을 실행
first.py의 __name__은 "__main__" 이고, second.py의 __name__은 "second"가 들어가게 됩니다.

반대로 second.py를 기준으로 프로그램을 실행하면
first.py의  __name__은 "first" 이고, second.py의 __name__은 "__main__"이 됩니다.

정리하면,
직접 실행된 파일 __name__ == "__main__" 
임포트 돼서 모듈로 사용된 .py 파일 __name__ == "모듈이름"

말로만 설명하니 어려운데 잠시 코드를 볼까요?
각 파일에 코드가 이렇게 존재한다고 하겠습니다. (편의상 하나의 텍스트 상자에 표시합니다.)

 

1-3) __name__ == __main__ 구분 예제

# first.py
import second  # 모듈로 second 부르기
my_name = __name__
print(f"first.py : {my_name}")

# =================================

# second.py
my_name = __name__
print(f"second.py : {my_name}")

first.py에서 second.py를 임포트 해서 프로그램을 실행시켜 보겠습니다.

* first.py 를 메인으로 해서 프로그램을 실행시킨 결과

결과를 보면 import second를 이용해서 second 파일을 임포트 하는 것을 볼 수 있습니다.
파일을 임포트를 하게 되면 그 파일을 실행시킨다고 생각하면 되는데요. 파일을 실행시키기 때문에 print 함수도 동작을 하게 됩니다.

second.py :  second 인 것을 보면 import 된 second.py 파일의 __name__ 에는 파일 이름(모듈 이름)이 들어간 것을 볼 수 있습니다.

반면에 메인으로 실행시킨 first.py 파일에서 __name__ 변수의 값은 first.py : __main__ 인 것을 볼 수 있습니다.

여기서 **꼭** 알아야 할 것은 두 가지인데요
(1) 파일이 임포트 될 때 해당 파일이 실행이 되는 것과 동일하다. (print 함수 같은 거 바로 출력됨)
(2) 메인으로 실행한 파일의 __name__에는 "__main__"이 들어간다.

 

* second.py를 메인으로 해서 프로그램을 실행시킨 결과 

반대로 second.py 파일을 주 프로그램으로 실행을 시켜보겠습니다.
import 한 것도 없기 때문에 바로, second.py == __main__ 이라는것이 나오는 것을 볼 수 있습니다.

아까 전엔 다른 파일의 모듈로 사용되어서 __name__이 "second" 였던 것과는 달리
본인이 메인으로 프로그램이 실행되니 __name__이 "__main__"이 된 것을 볼 수 있습니다.

 

 

2. 파이썬 __name__ 예제


__name__이 주 프로그램인지 임포트 된 모듈인지에 따라서 이름이 변경하게 된 성질을 이용해서
우리는 중요한 것을 할 수 있습니다.

(1) 파일이 임포트 될 때 해당 파일이 실행이 되는 것과 동일하다. (print 함수 같은 거 바로 출력됨)
(2) 메인으로 실행한 파일의 __name__에는 "__main__"이 들어간다.

위에서 제가 강조했던 두 가지 특징에 대해서 살펴보면 이런 생각이 들 수 있습니다.

'그럼 파일에 print 같은 함수를 막 써놨는데, 나중에 다른 사람이 내 파일을 모듈로 사용하면 그냥 출력되겠네?'

이런 상황을 방지하고자 __name__ 이 있는 것입니다.

보통 if 문을 통해서 __name__ == "__main__" 인지 구분해서 "메인으로 실행되면 ~~~ 을 해라" 이런 식으로 프로그램을 작성합니다.

예제를 보면 x.py, y.py 라는 두 개의 파일이 있다고 가정하겠습니다. 순서대로 x.py, y.py 입니다.

# 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}")

 

- x.py 를 메인으로 해서 프로그램 실행

import y에 의해서 모듈로 사용된 y.py 파일이 실행되는데 if __name__ == "__main__" 에 의해서 __name__이 메인으로 실행되지 않아서 아래 print 문이 실행되지 않게 됩니다.

 

- y.py 를 메인으로 해서 프로그램 실행

y.py를 메인으로 해서 실행을 하니 __name__ == "__main__"이 True 가 되어서 아래 print 쪽 함수들이 수행된 것을 볼 수 있습니다.

 

이런 식으로 메인으로 쓰일 때, import 모듈로 사용될 때를 구분하기 위해서
if __name__ == "__main__" 을 이용해서 사용하면 됩니다.

 

감사합니다. 이상으로 __name__ 과 __main__ 에 대해서 알아보았습니다.

반응형