Python 소스코드를 보면 module(.py 파일) 내부에

if __name__ == "__main__": 이라는 구문을 많이 볼 수 있다.

 

Python 문법을 알고, 함수도 어느정도 작성할 수 있는 나에게 위의 구문은 보기만해도

낯선 것에 의한 강한 거부감이 든다...

 

하지만 프로젝트를 진행하는 과정에서 이 문법을 포함한 몇 가지의 문법들은 몰라서는 소스코드를 한참을 봐도 이해가 안되고,

사용할 때 마다 기술 부채를 느끼기 때문에 이번 기회에 제대로 뜯어보며 정리하려고 한다.

딱 나와 같은 수준을 가진 Python 사용자가 있다면 이 글이 도움이 되었으면 좋겠다.


 

< 가정 >

1. test.py 와 exam.py 이 있음

2. exam.py 에서 test 를 import 한다. (import test)

 

1. __name__ ,  __main__  이란?

__name__ : 모듈의 이름을 담고 있는 파이썬 내장 변수, test.py 라는 파일에서 확장자 .py를 제외한 test가 모듈의 이름

__main__ : 최상위 코드가 실행되는 환경의 이름. 실행을 시작하는 첫 번째 Python 모듈

 

__main__ 의 이해가 어려울 듯 하여 다음의 예시를 참고

 

1-1) 간단한 예

# test.py 에서 다음을 작성 후 test.py 에서 실행
print('__name__ value :', __name__)

__name__ value : __main__     

(import 없이 test.py 에서 실행을 했기 때문에 최상위 코드에서 실행한 것 __name__ = __main__)

# 위의 test.py 수정없이 작성
# exam.py 에서 다음을 작성 후 exam.py 에서 실행
import test
print('__name__ value :', __name__)

__name__ value : test

__name__ value : __main__

(import test 를 했으므로 test.py 에 있는 print() 가 실행되는데 이때 exam.py 입장에서 모듈의 이름은 test 이다.

이후 exam.py 에 있는 print() 가 실행되는데, exam.py 입장에서 모듈의 이름은 __main__ 이다. (최상위 코드 환경, exam 아님 주의

따라서 exam.py 에서 실행을 하면 test.py 모듈을 가져온 것에서 1번 실행, exam.py 에서 1번 실행 하여 총 2회 실행된다.

 

2. 왜 사용하는가?

위의 예에서 exam.py 에서 test를 import 할 때, test.py 에 있는 명령어가 실행되는 것을 보았다.

만일, test.py 에 있는 명령어가 실행되는 것을 원치 않을 경우, if __name__ == "__main__": 을 추가하여 막을 수 있다.

 

 

3. 모든 경우의 예시

필자는 스스로 다음 코드를 돌려보면서 과정을 이해를 했다.

<가정>에서 나올 수 있는 경우는 총 4개이다.

작성의 편의를 위해 if __name__ == "__main__": 를 A 라고 치환하면 아래의 4경우가 존재한다.

(모든 실행은 exam.py 에서 진행된다.)

  1. test.py + exam.py  모두  A 가 없는 경우
  2. test.py 에는 A 가 있지만, exam.py 에는 A 가 없는 경우
  3. test.py 에는 A 가 없고, exam.py 에는 A 가 있는 경우
  4. test.py + exam.py 모두 A 가 있는 경우

3-1) test.py + exam.py  모두  A 가 없는 경우

# test.py 에서 작성
print('__name__ value :', __name__)
# exam.py 에서 작성
import test
print('__name__ value :', __name__)

__name__ value : test

__name__ value : __main__

 

3-2) test.py 에는 A 가 있지만, exam.py 에는 A 가 없는 경우

# test.py 에서 작성
if __name__ == "__main__":
    print('__name__ value :', __name__)
# exam.py 에서 작성
import test
print('__name__ value :', __name__)

__name__ value : __main__   (test 가 모듈이름 이므로 첫 if 문 실행 X)

 

3-3) test.py 에는 A 가 없고, exam.py 에는 A 가 있는 경우

# test.py 에서 작성
print('__name__ value :', __name__)
# exam.py 에서 작성
import test
if __name__ == "__main__":
    print('__name__ value :', __name__)

__name__ value : test

__name__ value : __main__

(3-1 과 동일)

 

3-4) test.py + exam.py 모두 A 가 있는 경우

# test.py 에서 작성
if __name__ == "__main__":
    print('__name__ value :', __name__)
# exam.py 에서 작성
import test
if __name__ == "__main__":
    print('__name__ value :', __name__)

__name__ value : __main__

(3-2 와 동일)

 

 

4. 마치며

3)의 결과로부터

사실상 작성하는 모듈이 import 될 여지가 없다면 if __name__ == "__main__": 구문은 필요없다.

그 이유를 답할 수 있다면 이 process를 완벽하게 숙지 했다고 생각할 수 있다.

이제 우리는 module 단위로 함수를 작성하는 등. 효율적인 Python 프로그래밍을 할 수 있게 되었다. 복잡한 프로젝트에 도전해보자.

잘못된 정보가 있으면 피드백 주세요 감사히 수정하겠습니다.