Python 특수 필드 이해하기 (내장 변수: __name__ )

python post logo 파이썬

__name__ 은 Python에서 기본적으로 정의된 내장 변수입니다. __name__ 변수는 현재 Python 모듈의 이름을 나타냅니다.

만약, 작성한 Python 스크립트가 다른 파이썬 프로그램에서 import된 모듈로써 실행될 때 __name__ 의 값은 “__main__“이 아닌 모듈 이름입니다. 반면에, 직접 실행한 Python 스크립트의 경우 __name__ 의 값은 “__main__“입니다.

결과적으로 __name__ 은 Python 스크립트가 어떤 환경에서 실행되었는지 판단할 때 사용될 수 있습니다. 예를 들어 한 파이썬 스크립트가 다른 프로그램에서 import 된 경우에는 부가적인 코드를 실행하지 않게 하기 위해 if __name__ == “__main__“: 분기문을 사용할 수 있습니다.

예약변수 __name__ 에 “__main__” 값이 설정되는 경우

다음과 같이 func_aaa()함수가 실행되는 test001.py파일을 작성합니다.

C:\temp>notepad test001.py
def func_aaa():
    print("test001#func_aaa")
    print(__name__) 
func_aaa()

다음과 같이 python명령으로 파이썬 파일(test001.py)을 실행하면 가장 먼저 func_aaa()함수가 실행되고 예약변수 __name__ 에는 “__main__” 이 설정됨을 확인할 수 있습니다.

C:\temp>python test001.py
test001#func_aaa
__main__

예약변수 __name__ 에 파일명이 값으로 설정되는 경우

다음과 같이 func_aaa()함수가 실행되는 파이썬 파일(test001.py)과 이 파일을 import 하는 또 다른 파이썬 파일(test002.py)을 작성합니다.

C:\temp>notepad test001.py
def func_aaa():
    print("test001#func_aaa")
    print(__name__) 
func_aaa()
C:\temp>notepad test002.py
import test001
print("another python file")

다음과 같이 python명령으로 파이썬 파일(test002.py)을 실행하면 가장 먼저 import되는 파이썬 파일(test001.py)을 전개 배치하면서 func_aaa()함수가 실행되고 예약변수 __name__ 에는 이 변수를 사용한 파일의 확장자를 제외한 “test001” 이 설정됩니다.

C:\temp>python test002.py
test001#func_aaa
test001
another python file

[키 포인트]

위의 결과로 python명령으로 실행되는 파이썬 파일에서 사용되는 예약변수 __name__ 만이 “__main__” 이라는 값이 설정된다는 것을 확인할 수 있었습니다. 그리고 import로 전개된 파이썬 파일에서 사용되는 예약변수 __name__에는 파일명이 값으로 설정된다는 것을 확인할 수 있었습니다.

import대상 파이썬 실행 조건 추가하기

그러다면 import된 파이썬 파일이 전개, 배치되어 바로 실행되지 않도록 하려면 어떻게 해야 할까요? 파이썬 프로그램 작성 기법에는 이미 그 해결책이 준비 되어 있습니다. 다음과 같이 실행 조건문 if __name__ == “__main__“: 를 추가하면 됩니다.

C:\temp>notepad test001.py
def func_aaa():
    print("test001#func_aaa")
    print(__name__) 
if __name__ == "__main__":
    func_aaa()

다음과 같이 python명령으로 실행되는 파이썬 파일에는 조건문 if __name__ == “__main__“: 를 추가할 필요는 없습니다. 조건문을 추가하든, 안 하든 func_aaa()는 실행되기 때문입니다.

C:\temp>python test001.py
test001#func_aaa
__main__

그러나 다음과 같이 import 대상이 되는 파이썬 파일에는 조건문 if __name__ == “__main__“: 를 추가해야 합니다. 사용되는 예약변수 __name__ 에는 “test001“가 설정 되어 추가된 조건문 if __name__ == “__main__“: 를 만족하지 않아 func_aaa()를 실행하지 않기 때문입니다.

C:\temp>notepad test002.py
import test001
print("another python file")
C:\temp>python test002.py
another python file

import되는 파이썬 파일은 왜 실행 되는가?

import 대상이 되는 파이썬 프로그램은 import하는 프로그램의 일부로서 전개, 배치되어 실행됩니다. 다음은 sample1.py, sample2.pysample3.py에서 import하는 파이썬 샘플 프로그램입니다.

C:\temp>notepad sample1.py
print("sample1#test1")
C:\temp>notepad sample2.py
def func_1():
    print("sample2#func_1()#test2")
def func_2():
    print("sample2#func_2()#test3")
C:\temp>notepad sample3.py
import sample1
import sample2
print("sample3#test4")

python명령으로 파이썬 파일(sample3.py)를 실행하면 import 대상이 되는 sample1.py, sample2.py가 전개, 배치, 실행되어 다음과 같은 결과를 출력합니다.

C:\temp>python sample3.py
sample1#test1
sample3#test4

더 이해하기 쉽게 위 sample3.py에서 import된 sample1sample2를 전개 배치하면 다음과 같은 프로그램이 됩니다.

C:\temp>notepad sample4.py
print("sample1#test1")
def func_1():
    print("sample2#func_1()#test2")
def func_2():
    print("sample2#func_2()#test3")
print("sample3#test4")

그리고 python명령으로 파이썬 파일(sample4.py)를 실행하면 파이썬 파일(sample3.py)를 실행할 때와 똑같은 결과가 출력됩니다.

C:\temp>python sample4.py
sample1#test1
sample3#test4

참고로 func_1()func_2() 함수는 정의만 되어 있을 뿐 실행되지 않습니다. import된 프로그램이 전개, 배치 되더라도 실행하지 않도록 하려면 이 글의 앞에서 설명한 것처럼 다음과 같이 조건문 if __name__ == “__main__“: 를 추가해야 합니다.

C:\temp>notepad sample1.py
if __name__ == "__main__":
    print("sample1#test1")

위의 수정으로 sample3.py에서 import된 sample1의 코드는 조건문 if __name__ == “__main__“:를 만족하지 않기 때문에 실행되지 않아 다음과 같은 결과를 출력합니다.

C:\temp>python sample3.py
sample3#test4
제목과 URL을 복사했습니다