모듈과 시작점

GreenBean·2022년 6월 27일
0
post-thumbnail

모듈과 시작점

if __name__ == '__main__'

if __name__ == '__main__':
    코드
  • 이 코드는 현재 스크립트 파일이 실행되는 상태를 파악하기 위해 사용
# in hello.py
print('hello 모듈 시작')
print('hello.py __name__:', __name__)    # __name__ 변수 출력
print('hello 모듈 끝')
# in main.py
import hello    # hello 모듈을 가져옴
 
print('main.py __name__:', __name__)    # __name__ 변수 출력
# 실행 결과
hello 모듈 시작
hello.py __name__: hello
hello 모듈 끝
main.py __name__: __main__
  • 실행을 해보면 hello.py 파일과 main.py 파일의 __name__ 변수 값이 출력
  • 파이썬에서 import로 모듈을 가져오면 해당 스크립트 파일이 한 번 실행
    • hello 모듈을 가져오면 hello.py 안의 코드가 실행됨
    • 따라서 hello.py__name__ 변수에는 'hello'가 들어가고, main.py__name__ 변수에는 '__main__'이 들어감

  • 즉, __name__모듈의 이름이 저장되는 변수이며 import로 모듈을 가져왔을 때 모듈의 이름이 들어감
    • 하지만 파이썬 인터프리터로 스크립트 파일을 직접 실행했을 때모듈의 이름이 아니라 '__main__'이 들어감
    • 참고로 __name____main__을 헷갈리지 말 것 주의
  • 좀 더 정확하게 알아보기 위해 콘솔(터미널, 명령 프롬프트)에서 python으로 main.py 파일을 실행
C:\project>python main.py
hello 모듈 시작
hello.py __name__: hello
hello 모듈 끝
main.py __name__: __main__
  • python main.py와 같이 파이썬으로 스크립트 파일을 직접 실행
    • 여기서도 hello.py 파일의 __name__ 변수에는 'hello' 그리고 main.py 파일의 __name__ 변수에는 '__main__'이 들어감

  • 하지만 다음과 같이 python으로 hello.py 파일을 실행해보면 결과가 조금 달라짐
C:\project>python hello.py
hello 모듈 시작
hello.py __name__: __main__
hello 모듈 끝
  • hello.py 파일의 __name__ 변수에는 'hello'가 아니라 '__main__'이 들어감
    • 즉, 어떤 스크립트 파일이든 파이썬 인터프리터가 최초로 실행한 스크립트 파일의 __name__에는 '__main__'이 들어감
    • 이는 프로그램의 시작점(entry point)이라는 뜻

  • 파이썬은 최초로 시작하는 스크립트 파일과 모듈의 차이가 없음
    • 어떤 스크립트 파일이든 시작점도 될 수 있고, 모듈도 될 수 있음
    • 그래서 __name__ 변수를 통해 현재 스크립트 파일이 시작점인지 모듈인지 판단
  • if __name__ == '__main__':처럼 __name__ 변수의 값이 '__main__'인지 확인하는 코드는 현재 스크립트 파일이 프로그램의 시작점이 맞는지 판단하는 작업
    • 즉, 스크립트 파일이 메인 프로그램으로 사용될 때와 모듈로 사용될 때를 구분하기 위한 용도

스크립트 파일로 실행하거나 모듈로 사용하는 코드 만들기

# in calc.py
def add(a, b):
    return a + b
 
def mul(a, b):
    return a * b
 
if __name__ == '__main__':    # 프로그램의 시작점일 때만 아래 코드 실행
    print(add(10, 20))
    print(mul(10, 20))
# 실행 결과
30
200
  • IDLE에서 실행하거나 python calc.py와 같이 파이썬 인터프리터로 실행하면 10, 20의 합과 곱이 출력됨
    • 즉, 프로그램의 시작점일 때는 if __name__ == '__main__': 아래의 코드가 실행
  • calc.py를 모듈로 사용하면 어떨까?
>>> import calc
>>>
  • 모듈로 가져왔을 때는 아무것도 출력되지 않음
    • 왜냐하면 __name__ 변수의 값이 '__main__'일 때만 10, 20의 합과 곱을 출력하도록 만들었기 때문
    • 즉, 스크립트 파일을 모듈로 사용할 때는 calc.add, calc.mul처럼 함수만 사용하는 것이 목적이므로 10, 20의 합과 곱을 출력하는 코드는 필요가 없음
  • 이때는 다음과 같이 calc.addcalc.mul 함수에 원하는 값을 넣어서 사용하면 됨

Tip! 추가 내용

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

Tip! 추가 내용

  • __name__ 의 정체
    • 파이썬의 내장 변수 혹은 글로벌 변수
  • 일단 __name__이라는 변수는 파이썬에서 정한 "이미 있는" 변수
    • 이 변수에는 해당 파이썬 파일의 이름 즉, 모듈의 이름을 담게 됨
    • 예시: function1.py이면 function1__name__이 됨
  • 그런데 "그 파일 안에서" 해당 함수를 실행시키면 __name__ 변수에 담기는 것은 그 파일 혹은, 모듈의 이름이 아니고 __main__이라는 값이 되도록 정해져 있음
  • 반면, 그 파일 안에서 그 함수를 실행시키는 것이 아니라 새로운 파일(import_function1.py)에서 function1.py라는 모듈을 import해서 가지고 와서 사용하는 경우에는 __name__ 변수에 그 모듈의 이름이 담김
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글