if __name__ == "__main__"

파이썬 초심자가 if __name__ = "__main__"의 의미를 이해하는 데에 상당한 어려움이 있을 듯 하다. 해서 인터넷을 검색해본 결과 여기에서 아주 좋은 글을 발견하여 일부를 인용한다. 


[내용 1]

파이썬의 모듈에 아래와 같은 코드가 존재할 때가 있다.

 

<코드>

if __name__=="__main__"

 

그대로 해석해보면 '__name__이라는 변수의 값이 __main__이라면 아래의 코드를 실행하라.'라는 뜻이다.

 

위 글을 이해하려면 먼저 파이썬의 코드실행 방식과 __name__이라는 내장변수를 알아야한다.

 

 

 

파이썬의 코드 실행 방식

 

 

C언어 또는 자바와 같은 프로그래밍 언어에서는 항상 main()이라는 함수를 시작으로 프로그램을 실행시킨다. 하지만 파이썬은 main함수가 존재하지 않는다. 그렇다면 어떤 방식으로 코드를 실행시키는 것일까?

 

파이썬은 크게 두 가지 특징이 있다.

 

1. 들여쓰기를 통해 코드 실행의 레벨을 결정한다.

2. main이 존재하지 않는다.

 

아래의 예시는 두 수를 더해서 출력해주는 코드이다. 차이점이 눈에 띌 것이다.

 

 

<코드 - C>

#include <stdio.h>

int sum(int num1, int num2) {
    return num1 + num2;
}

int main() {
    printf("%d", sum(1, 1));

    return 0;
}

 

<코드 - Python>

def sum(num1, num2)
    return num1 + num2
print(sum(1, 1))

 

파이썬 코드에서 들여쓰기를 한 return문은 들은 sum 이라는 함수에 속해있는 코드로 볼 수 있고, print함수는 sum함수 밖에 존재하는 것이다.

 

결국 파이썬은 main문이 없는 대신에, 들여쓰기가 되지 않은 Level0의 코드를 가장 먼저 실행시킨다.

 

 

 

__name__

 

 

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

 

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

 

따라서 아래의 코드를 통해 알아보도록 하자.

 

 

<코드 - 모듈>

#module.py

def hello():
    print("Hello!")

print(__name__)

 

<코드 - 메인>

#main.py

import module

print(__name__)
module.hello()

 

<결과 - 메인>

module
__main__
Hello!

 

간단하게 module.py에 대해 설명하자면, hello()라는 함수를 가지고 있으며, __name__내장 변수를 출력하도록 되어있다.

main.py에서는 module을 불러와서 출력하고, main에서의 __name__내장 변수를 출력하도록 했다.

 

결과를 보면, 먼저 import된 module의 __name__이 먼저 module이라는 이름으로 출력된다. 그리고나서 main.py의 __name__이 가지고 있는 __main__이 출력되고, 모듈의 hello()함수 호출 결과가 출력되고 마무리 된다.

 

이로써 알 수 있는 것은 직접 실행한 파일은 __name__ 내장변수에 __main__이라는 값이 들어간다는 것을 알 수 있고, 그렇지 않은 import된 모듈들은 각 모듈의 이름이 들어간다는 것을 알 수 있다.

 

위의 모듈에 if __name__ == "__main__" 조건문을 살짝 넣어서 다시 실행시켜 보자.

 

 

<코드 - 모듈>

#module.py

def hello():
    print("Hello!")

if __name__=="__main__":
    print(__name__)

 

<결과 - 메인>

__main__
Hello!

 

위와 같이 모듈은 직접 실행되지 않으므로 __name__ 의 값이 __main__이 아니게 되어서 출력을 하지 않는 모습을 볼 수 있다.

 

 

 

결론

 

 

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

 

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

 


그래고 아래는 조금 다르게 설명한 블로그의 내용을 여기에서 가져와서 인용해둔다. 아직 그래도 두 개의 py중 어떤게 __name__이 __main__으로 정해지는 지는 알아내지 못하였다...;;


[내용 2]

 안녕하세요, Davey 입니다. 오늘은 간혹 보이는 구문인, if __name__ == '__main__' : 의 조건문의 의미와 왜 사용하는지, 그리고 사용하는 방법에 대해서, 제 나름대로 이해한 부분을 설명 드리도록 하겠습니다. 쉬운 이해를 돕기 위해서, 하나의 예제를 통해서, 설명 드리도록 하겠습니다. 

1. if __name__ == '__main__' :

: 구문 자체가 조건 문인 것를 확인 하실 수 있습니다. 이 구문을 살펴 보면, "__name__" 항목이, "__main__"인지를 물어보는 구문입니다. 즉, 맞으면 실행하고, 틀리면 else 구문에 기재된 code를 실행하라는 것입니다. 그럼 간단하게 아래 code를 통해서 추가 설명 드리겠습니다. 


# __name__이 __main__이면 '실행합니다' 를 출력하고, 틀리면 '실행하지 않습니다.'를 출력합니다.

if __name__ == '__main__':

   print('실행합니다.')

 

else:

    print('실행하지 않습니다.')

- 보통 모든 python file은 그 자체 파일에서, 코드를 구현하고, 수행할 때는 "__name__" 이, "__main__" 으로 자동 할당이 됩니다. 위 코드를 실행 시켜보면 거의 모든 파일에서는 '실행합니다'가 출력이 됩니다.

2. if __name__ == '__main__' : 사용 용도 및 응용하기

if __name__ == '__main__'에 대해서 간단하게 설명을 드렸으니, 어떻게 이용하는지를 설명드리도록 하겠습니다. 일단 python file을 아래와 같이 두 개를 만들어 보겠습니다. 

 

 1) __name__01.py

 2) __name__02.py

 

 __name__01.py 간단하게 함수를 포함한 코드를 작성해 보도록 하겠습니다.

 

# 함수 선언을 하여, test_text 변수에 입력하는 text를 같이 출력하는 함수

def test01 (test_text):

    return print('Hello, How are you', test_text)

 

 

test01("Davey")
 

- 위 코드를 출력을 해보면 아래와 같은 결과를 보실 수 있습니다. 여기까지는, 이미 다른 분들은 이해 하실 거라고 생각합니다. 그럼 다른 파일에서, "test01" 함수를 이용을 해보도록 하겠습니다. 

 

 

 __name__02.py 에, "test01" 함수를 불러와서 구현하는 코드를 짜보도록 하겠습니다. 코드는 아래와 같습니다.

 

import __name__01

print('================== 다른 파일에서 선언한 함수 불러와서 실행 =============')

__name__01.test01("other file")

 

- 위 코드를 실행을 시켜 보면 아래와 같은 결과 값을 보실 수 있습니다. 아래 결과 값을 보시면, 우리가 의도하지 않은, "Hello, How are you Davey" 까지 출력이 되는 걸 확인 하실 수 있습니다. 이런 현상 때문에, 위에  "if __name__ == '__main__' :" 의 조건문을 활용을 하는 것입니다. 

 

- 그럼 대체, "__name__" 이게 무엇인가 한 번 알아보도록 하겠습니다. 

 

1) __name__01.py 에서 __name__01.py의 "__name__"을 출력해보도록 하겠습니다. 아래와 같이 "__main__"을 출력하는 걸 확인 하실 수 있습니다. 


def test01 (test_text):

    return print('Hello, How are you', test_text)

 

 

print(__name__)

 

2) 그럼 "__name__02.py" 에서 "__name__01.py" 의  "__name__" 과 "__name__02.py" 의 "__name__" 을 출력해보도록 하겠습니다. 그럼  "__name__01.py" 의 "__name__" 이 "__name__01"이 출력되는 걸 확인 하실 수 있습니다.

 


import __name__01

print(__name__)
print(__name__01.__name__)

 

- 즉, 실행하는 파일에 위치에 따라, "__name__" 의 값이 변환을 하는 것이죠. 그래서 위에 필요하지 않은 "Hello, How are you Davey" 를 같이 출력시키고 싶지 않은 때는, "__name__01.py" 에 아래와 같이 코드를 구현하며 됩니다.


def test01 (test_text):

    return print('Hello, How are you', test_text)

 

 

if __name__ == '__main__':

 

    test01("Davey")

- 그리고 나서, "__name__02.py" 에서 기존 Code를 실행 시켜보면 아래와 같이 정상적으로 원하는 값이 출력되는 것을 확인 하실 수 있습니다. 

 

 이상입니다. 위에 설명 드린 대로, 현재 코드를 실행하는 파일의 위치에 따라, "__name__" 의 이름이 바뀌므로, 이 부분을 활용하여, 다른 코드에 있는 함수를 이용할 때, 코드를 구현하시면 됩니다.


그래고 아래는 두 개의 py파일을 통해 어떤게 __main__으로 인식하게 하는지에 대해 약간 언급이 있는 내용이다. 여기에 원본이 있고 이 중 일부를 인용했다.


[내용 3]

 

# 1. name 이란? 

__name__ 은 모듈의 이름을 저장하는 변수입니다.

모듈의 이름을 저장? 

(모듈 : 임포트 용도의 파일을 뜻한다)

궁금할 땐 일단 출력해보면 이해가 빠른데

 

# 2. 예제로 이해하자

# apple.py

def sum(x,y):
    return x+y

def minus(x,y):
    return x-y

print( f'apple name = {__name__}')
print('sum(2,3)= 5')
print('minus(3,2)= 1')
# bus.py

import apple

x= 5
y= 3

print (f'\n x+y = {apple.sum(x,y)}')
print (f'\n bus name = {__name__}')

다음과 같이 두개의 .py 파일이 있습니다.

 

bus.py 를 실행시키면 

 

다음과 같이 출력됩니다.

apple 을 import했으므로 apple의 코드가 실행 되는데 

그안에 프린트 내용이 그대로 출력되고 나서 def sum(x,y) 함수가 출력 되었습니다.

 

import한 apple 의 __name__ 은 모듈(파일)이름은 apple 로 그대로 출력되었고

run을 직접 한 bus.py의 __name__은 __main__으로 출력되었습니다.

 

이처럼 내가 직접 실행시킨 모듈이 __main__ 함수가 됩니다.

 

이 __name__ 변수를 이용하여 조건을 준다면 apple.py의 내용 중 원하는 부분을 실행,

원하지 않는 부분을 실행시키지 않는 제어가 가능합니다.

 

조건문 if __name__ == '__main__' 과

if __name__ == 'apple' 을 이용해봅니다.

 

다음과같이 apple.py 를 수정합니다.

def sum(x,y):
    return x+y

def minus(x,y):
    return x-y

print( f'apple name = {__name__}')

if __name__ == 'apple':     # 조건 추가
    print('sum(2,3)= 5')

if __name__ == '__main__':  # 조건 추가
    print('minus(3,2)= 1')

bus.py를 실행하면 

결과는 다음과 같습니다.

 

apple.py의 if __name__ == 'apple' 인 부분만 실행되어 출력되었습니다.

apple.py 를 실행 시켜 보면

 

apple.py 를 직접 실행하였으므로 __name__ = __main__ 이 되어

if __name__ == '__main__' 구문만 실행 되었습니다.

 

이젠 이해가 잘 됩니다!


그래고 아래는 또 다른 예제...인데 이곳에서 인용했다.


[내용 4]

사람의 생각을 대신해 주는 서비스는 언제 나올까?

    이미지 맵

    Engineering/코딩 다른 글

    이전 글

    다음 글