if __name__ == __main__ 의 의미

Language/Python 2019.02.08 23:48 posted by TechNote.kr


[Python 스크립트 파일의 실행]


python은 C언어나 Java 와 달리 main() 함수가 존재하지 않는다.

이에 따라 스크립트 파일을 실행하게 되면 들여쓰기가 되지 않은 line들을 파일 상단 부터 순차적으로 읽어 수행하게 된다.


[sample.py]

a = 1

b = 3

c = a + b


print(c)


def temp():

    print("abc")


~/python$ python sample.py

4


위에서 보듯이 들여쓰여진 코드인 함수 부분은 수행되지 않았음을 볼 수 있다. 

 



[다른 Python 스크립트 파일을 모듈로서 실행]


python 스크립트 파일은 또 다른 python 스크립트 파일을 하나의 모듈로써 읽어 들일 수 있다. 


[sample_call.py]

import sample


~/python$ python sample_call.py

4


import 만 해도 import 한 python 스크립트 파일이 수행되는 것을 확인할 수 있다. 

import 시 무조건 수행되는 것을 방지 하기 위해 함수로 구현하여 해당 함수만 호출할 수도 있다. 




[__name__] 의 의미


if __name__ == __main__ 의 의미를 알아보기에 앞서 __name__의 의미는 다음과 같다. 


모듈의 이름


상기의 코드를 조금 수정해 아래와 같이 수행해보면 다음과 같다.


[sample_call_mod.py]


import sample


print(sample.__name__)

 

호출한 모듈의 전역 변수인 __name__ 을 출력해 보면 해당 모듈의 이름을 확인할 수 있다. 


import sample as sp


print(sp.__name__)


위와 같이 as 로 alias를 해도 sp.__name__을 출력해 보면 원래 이름인 sample 로 표시되는 것을 확인할 수 있다.




[if __name__ == __main__ 의 의미]


__name__ 은 모듈의 이름을 표시하는 전역 변수라는 것을 알았는데, 그렇다면 if ___name__ == __main__ 은 어떤 경우일까. 모듈 이름이 __main__ 인 경우인 것인가.


__name__ 이 __main__ 인 경우는 조금 특별한 경우로 모듈이 다른 코드로 부터 import 되어 사용되는 상황이 아니라 바로 실행되는 경우에 가지게 되는 값이다.


즉, 위에서 sample_call_mod.py가 sample.py를 호출하였을 때는 sample.__name__ 은 sample 이었지만 sample.py를 직접 바로 실행하게 되면 __main__ 을 가지게 된다.


[sample_main.py]

print(__name__) 


~/python$ python sample_main.py

__main__


즉, 스크립트 파일을 직접 실행할 경우에만 코드를 수행되게 만들려면..


if __name__ == __main__: 조건 아래에 들여쓰기를 해서 작성하면 되는 것이다. 


이와 같은 코드를 통해 C언어나 Java 에서와 같은 main() 함수의 역할을 할 수 있게 된다.