본문 바로가기
Python/Tip & Etc

[python] if __name__ == '__main__'

by To올라운더 2023. 11. 27.
반응형

다른 사람들의 코드를 참고하거나

강의를 보다보면 생각보다 자주 눈에 띄는 코드가 있다.

 

바로 if __name__ == '__main__' : 과 같은 조건문인데,

내가 하나의 파이썬 파일에서 코드를 작성할 때는 필요가 없지만,

뭔가 모듈화를 하고 내 코드가 점점 복잡해진다면 그때는 꼭 필요한 요소가 된다.

(* 모듈화는 무엇이고, 왜 해야하는지는 다음 포스팅에서 다뤄보겠습니다.)

2023.11.28 - [IT 배우기/이것저것] - 모듈화 1(modularity)

 

모듈화 1(modularity)

오늘의 포스팅 주제는 앞서 예고한 모듈화(modularity)이다. 파이썬이라는 특정 언어에 국한한 것이 아니라 소프트웨어 전체에 해당하는 내용으로 문제 해결을 위한 분석이나 설계, 개발과 유지보

to-all-rounder.tistory.com

오늘 포스팅은 해당 조건이 어떨 때 사용하고 왜 이런 조건이 필요한지에 대해 알아보는 포스팅이다.

 

 

1. '__main__' 과 '__name__'은 무엇인가요?

 

 - 파이썬 기본 과정 중 변수에 대해 배우던 과정을 떠올려보면,

   변수를 생성할 때에 크게 제약사항은 없었지만, 

   몇가지 약속들을 통해 변수인지, 클래스인지, 매서드(함수)인지를 알 수 있었다.

   (*기억이 나지 않는다면, 아래 글을 참고해주세요.)

2023.06.06 - [Python/기초 과정] - 01. 파이썬 변수편

 

01. 파이썬 변수편

0. 이해보단 수긍... 변수에 앞서 2가지만 깊히 생각하지 않고 이렇게 한다라고 알고 시작해주세요. 1. print라는 내장 함수를 통해 터미널창에 문자 결과를 출력할 수 있다. (원하는 대로 동작하는

to-all-rounder.tistory.com

 

 - 그 중 언더바 또는 언더스코어('_') 2개를 사용하는 변수의 표현 방법은 매직매서드(magic method) 라는 별도의 명칭이 있을 정도로 파이썬 내부에서 별도로 사용이 되는 변수이며, 사용자가 사용을 피해야하는 변수명이라고만 간략히 설명이 되었었다.

 - 그리고 우리 같은 초보들이 이런 언더 스코어의 사용을 실제로 본 경험이라면 class에서 생성자를 생성할 때 '__init__' 의 형태로 만나본적이 있을 것이다.

 - 그리고 이런 매직매서드 중 하나가 바로 오늘 설명할 '__name__' 이다.

 - 아래와 같은 몇 개의 print 문을 생성한 뒤 마지막에 __name__도 출력하는 print문의 결과를 확인해보면

print('나의 이름은 {}입니다.'.format('핸리'))
print('나이는 {}입니다.'.format('15'))
print('사는 나라는 {}입니다.'.format('한국'))

print(__name__)

 

  위와 같이 작성된 항목들이 나타나고, 마지막에 __name__의 결과 값으로 __main__ 이 나타난다.

 

- 해당 파일을 main_desc.py로 저장을 한 뒤

 

- 다른 코드를 작성하다 우리가 위에서 사용한 코드를 활용해야겠다는 생각이 들면, 

  import를 통해 코드를 재사용하려 할 것이다.

 

- 아래처럼 main_desc 모듈을 불러온 뒤, 실행을 해보면, 

  의도한 바와는 달리 main_desc에서 작성된 print문이 자동으로 출력이 된다.

  출력된 결과를 통해 2가지 상황을 인지 할 수 있는데

  1. import만 하더라도 해당 모듈이 실행된다는 것이다.

     이 말을 조금더 확대해서 이야기하면,

     main_desc에서 작성된 print문을 신규로 생성한 import_test 파일 중 우리가 원하는 특정 위치에서 실행이 되는 것이 아니라,

     import문이 있는 곳에서 강제로 실행이 된다는 것

  2. main_desc 의 print(__name__) 의 결과가 처음과 달리 main_desc로 출력된다는 것이다.

 

- 위의 2가지 문제를 해결하는 방법을 진행해보면 __main__과 __name__을 왜 사용하는지 알 수 있다.

반응형

 

2. import 시 실행 되지 않게 수정하기

 - 해당 방법은 간단하다. 함수형태로 변경해 준 뒤, 필요할 때 실행만 하면 된다.

# main_desc.py

def introduce_print():

    print('나의 이름은 {}입니다.'.format('핸리'))
    print('나이는 {}입니다.'.format('15'))
    print('사는 나라는 {}입니다.'.format('한국'))

    print(__name__)
# import_test.py

import main_desc

print(1)
print(2)
main_desc.introduce_print()
print(3)
print(4)

 

 - main_desc.py 에서 introduce_print 문은 실행되지 않았기 때문에 실행을 하더라도 아무런 결과가 나타나지 않고,

   import_test.py 에서는 처음과 달리 import를 할 때 결과가 출력된 것이 아니라,

   우리가 원하는 위치에서 호출될 때 결과가 출력되는 것을 볼 수 있다.

 

 - 그럼 maim_desc 에서는 작성된 코드를 확인할 방법이 없는 것일까? 

   여기에 대한 해답은 print(__name__) 에 있다.

 

3. __main__ 과 __name__

 1) main_desc.py 에서 작성된 print(__name__) 이 main_desc.py 에서 출력될 때의 결과는 

    '__main__' 이 었고,

 2) main_dsec.py 에서 작성된 print(__name__) 이 import_test.py에서 호출되어 결과가 나타날 때는

   ' main_desc' 로 결과가 달랐다.

 3) 그럼 실제 import_test.py 에서도 동일하게 print(__name__)을 실행해 보면 어떤 결과가 나올까?

  바로 '__main__' 이다.

import main_desc

print(1)
print(2)
main_desc.introduce_print()
print(3)
print(4)

print(__name__)

 

 

 - 위의 3가지 결과를 놓고 볼 때, 각각의 .py는 자신의 __name__ 객체(변수)를 가지고 있고,

   import 되지 않은 실제 자신의 __name__ 변수의 값을  '__main__' 이라고 부른다는 사실을 알 수 있다. 

 

- 그럼 이제 처음 궁금증을 가졌던 조건문(if __name__ == '__main__' :)과 

  우리가 포스팅을 작성하며, main_desc에서 작성된 코드를 내부적으로 확인하는 방법이 같은 방법임을 알 수 있다.

 

 

4. 결과 코드

 1) main_desc.py

  - 이번에는 위와 달리 main_desc.py를 실행할 때에도 introduce_print()문이 실행되는 것을 확인할 수 있고,

def introduce_print():

    print('나의 이름은 {}입니다.'.format('핸리'))
    print('나이는 {}입니다.'.format('15'))
    print('사는 나라는 {}입니다.'.format('한국'))

    print(__name__)

if __name__ == '__main__':
    introduce_print()

 

 

 2) import_test.py

  - main_desc의 introduce_print()문 또한 import를 하자마자 실행된 것이 아니라, 우리가 원하는 위치에서 실행되는 것을 확인할 수 있다.

import main_desc

print(1)
print(2)
main_desc.introduce_print()
print(3)
print(4)

print(__name__)

 

반응형