def main():
pass
if __name__ == '__main__':
main()
글쓴이 처럼 파이썬 코드 중에서 위와 같은 코드를 보고 궁굼하다고 생각한 사람이 있을 것이다.
이번 포스팅에서는 왜 이것을 사용하는지에 대해 알아본다.
if __name__ == '__main__' :
사실 파이썬은 이 코드가 없어도 잘 돌아간다. 그런데 굳이 왜 이런 코드를 많이 볼 수 있느냐?
파이썬의 모듈시스템에 그 답이 있다.
처음에 파이썬을 스크립트를 실행할 때 사용자의 눈에 보이지 않지만 파이썬이 메모리에 로드하는 변수들이 있다.
locals() 로 확인하면 로드된 변수들을 확인할 수 있다. 리스트가 딕셔너리 자료형으로 저장되어 있다.
print(locals())
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0159AF58>,
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
'__file__': 'C:/Users/masterkay/PycharmProjects/pythonProject/main01.py', '__cached__': None}
이 때 맨 앞에 있는 '__name__' 이라는 키가 '__main__' 과 한쌍이다.
즉 __name__ 변수의 값은 '__main__' 이라는 것이다. 물론 이것은 딕셔너리에 리스트를 정리해놓은 것이고 실제 변수 __name__ 이 있다.
if __name__ == '__main__' :
변수는 자동완성으로 확인 가능하다.
그런데 이게 무슨 소용인가 싶을 것이다.
그것은 이 파일의 이름이 main01.py이고 python main01.py 을 실행시켰을 때 python 이 main01.py 파일을 메인 공간으로 삼는다.
같은 디렉토리에 새로운 파일 hello.py 를 만들어서 다음과 같이 작성한다.
print('hello module start')
print('hello.py __name__ : ', __name__)
print('hello module out')
그리고서 hello 를 import 한다.
import hello
print(locals())
그러면
같은 이름의 __name__ 변수가 파일에 따라서 다르게 출력되는 것이 보인다.
파이썬의 파일.py 을 하나의 모듈이라고 부른다. import 는 모듈을 가져오는 것이다.
__name__ 은 모듈간의 이름을 식별할 수 있게 한다. main 을 제외한 나머지 모듈에서는 자신의 파일명이 곧 __name__의 이름이다. 또한 변수기 때문에 이름을 바꿀 수도 있다. (main 이나 다른 모듈 다 가능)
__name__ = 'Hello Good'
locals() 에는 여러가지 유용한 정보들이 들어있다.
예를 들어 현재 모듈의 디렉터리와 파일을 리턴하려면 다음과 같이 한다.
print('hello.py __file__ : ', __file__)
os 모듈과 같이 사용하면 손쉽게 디렉터리를 다룰 수 있다.
여기까지 읽었다면 이제 왜 __main__을 사용하는지 알게 되었을 것이다.
작은 크기의 스크립트를 작성하는데는 별로 필요성을 못느끼는데 코드의 규모가 커지고 여러개의 모듈로 분리될 때 필요하다. main 은 프로그램의 시작점이자 종료하는 곳이다. 이 과정에서 의도치 않게 다른 모듈이 실수로 라도 실행되는 것을 막기 위함이다.
프로그램의 규모가 커질 수록 디테일이 더 필요하다.