티스토리 뷰

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


<코드>

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될 때는 출력되지 않으면서 모듈에 포함된 기능만을 포함시킬 수 있기 때문에 상당히 효율적인 프로그래밍이 가능하게 된다.




참고



점프 투 파이썬 - 박응용

https://hashcode.co.kr/questions/3/if-__name__-__main__%EC%9D%80-%EC%99%9C%EC%93%B0%EB%82%98%EC%9A%94

https://nyanye.com/python/2017/01/12/Python-built-in-variables/

'Programming > Python' 카테고리의 다른 글

[Python]오류 예외 처리  (0) 2019.03.09
[Python]__init__.py  (2) 2019.03.09
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함