__name__ 변수는?
파이썬의 내장변수로, 이 변수에는 기본적으로 해당 파이썬 파일의 이름이 들어간다.
쉽게 말하자면 모듈의 이름이 들어간다. 만약 내가 모듈, 즉 파일을 usercode.py로 저장했다면 __name__은 "usercode"가 된다.
그런데, 만약 내가 현재 열고 있는 파일 내에서 실행시키면 __main__이 __name__이 된다.
즉 내가 현재 usercode.py을 열고 실행시킨다면 __name__변수에 "__main__"이 저장된다.
그러나 usercode.py를 main.py 파일에서 import하고 실행시킨다면 usercode.py의 __name__변수에는 "usercode"가 저장된다. 아래 코드로 보자.
# usercode.py
def start(x, y):
print(f"{x, y} {__name__}에서 실행")
if __name__ == '__main__':
start(1, 2)
>>>
(1, 2) __main__에서 실행
usercode.py에서 실행시켜 __name__이 __main__인 것을 알 수 있다.
그렇다면 main.py에 usercode.py를 import해 사용해보자.
# main.py
import usercode
usercode.start(3, 4)
>>>
(3, 4) usercode에서 실행
어라? usercode.py에서 실행시켰을 때는 해당 함수에 존재하는 start(1, 2)도 잘 실행되었는데 main.py에서는 나타나지 않는 것을 볼 수 있다.
그렇다면 usercode.py에서 if __name__문을 지워보고 실행시켜보자.
# usercode.py
def start(x, y):
print(f"{x, y} {__name__}에서 실행")
start(1, 2)
# main.py
import usercode
usercode.start(3, 4)
>>>
(1, 2) usercode에서 실행
(3, 4) usercode에서 실행
이번에는 start(1, 2)와 start(3, 4) 모두 실행되는 것을 볼 수 있다.
그래서 if __name__ == '__main__':은?
결론은 모듈에 if __name__=="__main__"을 사용하는 이유는 import 했을 때 그 모듈안에 있는 함수들이 그대로 실행되는 것을 막기 위함이다. 이를 통해 모듈 내에서만 사용하는 함수들(테스트를 위한 로그 출력 함수 등)을 import 했을 때는 출력하지 않으면서 사용할 수 있다.
조금 더 깊게..?
대화형 인터프리터에서 위 코드들을 실행해보자. 대화형에서 인수를 얻기 위해 sys 모듈을 import 하고 코드를 약간 수정해보자.
sys 모듈의 인수 argv에는 python 명령어의 인수가 저장되어 있다. 맨 처음인 argv[0]에는 파일명인 usercode.py가 저장되어 있으므로 1부터 시작한다.
# usercode.py
import sys
def start(x, y):
print(f"{x, y} {__name__}에서 실행")
t1, t2 = sys.argv[1], sys.argv[2]
start(t1, t2)
>>> python usercode.py 1 2
('1', '2') __main__에서 실행
1, 2가 인자로 잘 들어가고 __main__에서 실행되었다는 메세지를 볼 수 있다. 스크립트로는 문제가 하나도 없어 보인다.
그러면 이번에는 대화형 인터프리터에서 모듈로 사용해보자.
$ python
Python 3.10.1 (tags/v3.10.1:2cd268a, Dec 6 2021, 19:10:37) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import usercode
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\reo91\OneDrive\Coding Practice\P C++, Python\Project\usercode.py", line 7, in <module>
t1, t2 = sys.argv[1], sys.argv[2]
IndexError: list index out of range
오류가 뜬다. 왜 오류가 뜰까? 왜냐하면 인수가 주어지지 않았는데 argv[1], argv[2]를 참조했기 때문이다.
그렇다면 어떻게 해결할까? 인수를 다루는 처리가 실행되지 않도록 처리해야 한다.
바로 이때 if __name__ == '__main__':이 사용된다.
usercode.py를 수정해보자.
# usercode.py
import sys
def start(x, y):
print(f"{x, y} {__name__}에서 실행")
def init():
t1, t2 = sys.argv[1], sys.argv[2]
start(t1, t2)
if __name__ == '__main__':
init()
이제 다시 대화형 인터프리터에서 실행시켜보자.
$ python
Python 3.10.1 (tags/v3.10.1:2cd268a, Dec 6 2021, 19:10:37) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import usercode
>>> usercode.start(3, 4)
(3, 4) usercode에서 실행
정상적으로 실행된다!
'◎ Python > 알게된 것 정리' 카테고리의 다른 글
[Python 정리] 리스트에서 평균과 가장 가까운 값의 인덱스를 찾는 법? (lambda 식 사용법) (1) | 2023.03.17 |
---|---|
[Python 정리] 내장함수 zip, filter에 대하여 (0) | 2022.09.26 |
[Python 정리] 프로퍼티, setter, 프라이빗 속성이란? (0) | 2022.09.24 |
[Python 정리] __init__과 __new__의 차이에 대하여 (0) | 2022.09.24 |
[Python 정리] 파이썬에서의 데이터 구조 (0) | 2022.09.22 |
자기계발 블로그