파이썬 소스 코드를 보다보면 자주 마주하게 되는 한 줄은 다음과 같다.
if __name__ == "__main__":
// 코드
// 코드
"__main__"이라고 써져 있는데 파이썬은 C언어 또는 자바와 같은 언어에서 항상 사용하는 main()이라는 함수가 존재하지 않는다.
그렇다면 "__main__"은 대체 무엇일까? 라는 의문에 해당 글을 작성한다.
차근차근 알아보는 걸로....
__name__
파이썬은 다양한 정보를 담고있는 내장 변수가 존재한다. 이중에서 __name__이라는 내장변수에 대해 먼저 알아보겠다.
이는 현재 모듈의 이름을 담고있는 내장 변수이다. 이 변수는 직접 실행된 모듈의 경우의 경우 __main__이라는 값을 가지게 되며, 직접 실행되지 않은 import된 모듈은 모듈의 이름(파일명)을 가지게 된다.
다음 예시는 통해 __name__이 동작되는 것을 알아보자.
<코드 - 모듈>
실행해보면 hello.py 파일과 main.py 파일의 __name__ 변수 값이 출력되는 것을 확인할 수 있다.
파이썬에서 import로 모듈을 가져오면 해당 스크립트 파일이 한 번 실행됩니다. 따라서 hello 모듈을 가져오면 hello.py 안의 코드가 실행된다. 따라서 hello.py의 __name__ 변수에는 'hello'가 들어가고, main.py의 __name__ 변수에는 '__main__'이 들어간다.
그렇다면 도대체 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)를 따로 정해 놓았습니다.
참고