Python

if __name__ == '__main__': 사용하는 이유

s_y_130 2021. 4. 7. 14:31

파이썬 소스 코드를 보다보면 자주 마주하게 되는 한 줄은 다음과 같다.

 

if __name__ == "__main__":
    // 코드
    // 코드

 

"__main__"이라고 써져 있는데 파이썬은 C언어 또는 자바와 같은 언어에서 항상 사용하는 main()이라는 함수가 존재하지 않는다.

그렇다면 "__main__"은 대체 무엇일까? 라는 의문에 해당 글을 작성한다.

 

차근차근 알아보는 걸로....

 


__name__

 

파이썬은 다양한 정보를 담고있는 내장 변수가 존재한다. 이중에서 __name__이라는 내장변수에 대해 먼저 알아보겠다.

 

이는 현재 모듈의 이름을 담고있는 내장 변수이다. 이 변수는 직접 실행된 모듈의 경우의 경우 __main__이라는 값을 가지게 되며, 직접 실행되지 않은 import된 모듈은 모듈의 이름(파일명)을 가지게 된다.

 

다음 예시는 통해 __name__이 동작되는 것을 알아보자.

 

<코드 - 모듈>

#hello.py
 
def hello():
    print("Hi!")
 
print(__name__)
cs

 

<코드 - 메인>

#main.py
 
import module
 
print(__name__)
module.hello()
cs

 

<결과 - 메인>

hello
__main__
Hi!

 

실행해보면 hello.py 파일과 main.py 파일의 __name__ 변수 값이 출력되는 것을 확인할 수 있다.

 

파이썬에서 import로 모듈을 가져오면 해당 스크립트 파일이 한 번 실행됩니다. 따라서 hello 모듈을 가져오면 hello.py 안의 코드가 실행된다. 따라서 hello.py __name__ 변수에는 'hello'가 들어가고, main.py __name__ 변수에는 '__main__'이 들어간다.

 

hellp.py를 모듈로 가져왔을 때

 

 

 

그렇다면 도대체 if __name__ == '__main__': 코드는 왜 사용하는 것일까??

 

일단 이 코드의 의미는 해당 모듈이 임폴트된 경우가 아니라 인터프리터에서 직접 실행된 경우에만, if문 이하의 코드를 실행하라는 의미이다. 즉, 이 코드는 현재 스크립트 파일이 실행되는 상태를 파악하기 위해 사용된다.

 

if __name__ == '__main__': 조건문을 넣은 다른 예시로 이를 알아보자.

 

//excuteThisModule.py
def func():
    print("function working")
 
if __name__ == "__main__":
    print("직접 실행")
    print(__name__)
else:
    print("임포트되어 사용됨")
    print(__name__)
cs

이 모듈을 실행할 수 있는 방법은 두 가지가 존재한다.

 

1) 인터프리터에서 직접 실행.

python hello.py

 

2) 다른 모듈에 임폴트해서 실행.

//현재 파일의 이름을 executor.py라고 해보자.

import executeThisMoudle.py
executeThisMoudle.func()

 

 

1) 처럼 인터프리터에서 직접 실행하면, __name__ 변수에 "__main__"이 담겨서 프린트된다.

직접실행
__main__

 

반면, 2) 처럼 모듈에서 임포트해서 실행하면, __name__변수에 “executeThisModule”이 담겨서 프린트된다.

임포트되어 사용됨
executeThisModule

 

즉, __name__ == __main__은 인터프리터에서 직접 실행했을 경우에만 if문 내의 코드를 돌리라는 명령이다.

 

 

결론

결론을 짓자면 모듈에 if __name__=="__main__"이라는 조건문을 넣어주고 그 아래는 직접 실행시켰을 때만 실행되길 원하는 코드들을 넣어주는 것으로 생각하면 쉬울 것이다.

 

예를 들어 모듈내에서만 사용하는 테스트나 로그같은 출력부분들을 넣어주게 되면 실제 import될 때는 출력되지 않으면서 모듈에 포함된 기능만을 포함시킬 수 있기 때문에 상당히 효율적인 프로그래밍이 가능하게 된다.

 

 

참고 | 파이썬은 왜 프로그램의 시작점이 정해져 있지 않나요?

파이썬이 처음에 개발 될 당시에는 리눅스/유닉스에서 사용하는 스크립트 언어 기반이었기 때문에 프로그램의 시작점이 따로 정해져 있지 않았습니다. 보통 리눅스/유닉스의 스크립트 파일은 파일 한 개로 이루어진 경우가 많은데, 이 스크립트 파일 자체가 하나의 프로그램이다 보니 시작점이 따로 필요하지 않습니다. 하지만 C 언어나 자바같은 언어는 처음 만들어질 때부터 소스 파일을 여러 개 사용했기 때문에 여러 소스 파일의 함수들 중에서도 시작 함수(main)를 따로 정해 놓았습니다.

 


 

참고

dojang.io/mod/page/view.php?id=2448

medium.com/@chullino/if-name-main-%EC%9D%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C-bc48cba7f720

hyoje420.tistory.com/45