파이썬에서 if __name__ == ‘__main__’ 의 기능과 중요성
이 가이드에서는 파이썬 프로그래밍에서 if __name__ == '__main__'
구문의 역할과 중요성을 자세히 살펴보겠습니다.
여러분이 파이썬 코드를 다루면서 다양한 모듈을 접했을 때, 적어도 한 번 이상 if __name__ == '__main__'
이라는 조건문을 본 적이 있을 것입니다. 이 글을 통해 해당 조건문의 의미와 사용법을 명확히 이해하고, 실질적인 예시를 통해 더욱 쉽게 접근할 수 있도록 돕겠습니다.
자, 그럼 시작해 볼까요!
파이썬에서 __name__의 의미
파이썬에서 모듈은 함수 정의, 변수 설정 등 다양한 코드를 담고 있는 .py
확장자를 가진 파일입니다. 예를 들어, hello_world.py
라는 파일이 있다면, 이것을 hello_world.py
파일 또는 hello_world
모듈이라고 부릅니다.
파이썬 모듈을 실행할 때, 인터프리터는 몇 가지 특수한 변수의 값을 미리 설정합니다. __name__
변수가 바로 그 중 하나입니다. __name__
변수의 의미를 이해하는 핵심은 파이썬에서 모듈을 어떻게 가져오는지(import)를 파악하는 것입니다.
📁 이 섹션의 코드는 여기에서 다운로드할 수 있습니다.
example-1
폴더를 살펴보시면 module1.py
파일이 있습니다. __name__
변수는 현재 모듈의 네임스페이스에 속합니다.
이 모듈은 __name__
변수의 값과 함께 메시지를 출력하는 기능을 합니다.
# example-1/module1.py print("이것은 module1 입니다.") print(f"module1 의 __name__ 변수 값은: {__name__} 입니다.")
이제 명령줄에서 module1
을 실행해 봅시다.
$ python module1.py
출력 결과를 보면, __name__
변수가 __main__
으로 설정된 것을 확인할 수 있습니다.
이것은 module1 입니다. module1 의 __name__ 변수 값은: __main__ 입니다.
파이썬에서 모듈 가져오기
파이썬에서는 모듈을 실행하는 것 외에도, 다른 모듈에 있는 함수나 변수를 현재 모듈에서 사용하고 싶을 때가 있습니다. 이때, 파이썬은 import 기능을 통해 이러한 작업을 가능하게 합니다.
import를 사용하면, 코드를 다시 작성하지 않고도 다른 모듈의 기능을 현재 모듈로 가져와서 재사용할 수 있습니다.
module2.py
파일은 module1
을 import하여 사용합니다.
# example-1/module2.py import module1 # module1을 import 합니다. print(f"이것은 module2 입니다.") print(f"module2 의 __name__ 변수 값은: {__name__} 입니다.")
이제 module2.py
를 실행하고 출력 결과를 관찰해 봅시다.
$ python module2.py
다음 출력 결과를 보면:
module1
이module2
안으로 import될 때,module1
의 코드가 실행되고 그 결과가 출력됩니다.- 이때
module1
의__name__
변수는__main__
이 아닌module1
이라는 값을 갖게 됩니다. - 반면,
module2
는 직접 실행되었으므로module2
의__name__
변수는__main__
이 됩니다.
이것은 module1 입니다. module1 의 __name__ 변수 값은: module1 입니다. 이것은 module2 입니다. module2 의 __name__ 변수 값은: __main__ 입니다.
💡 핵심 요약:
– 모듈이 직접 실행될 때, 해당 모듈의 __name__
변수는 __main__
과 같습니다.
– 모듈이 다른 모듈 내에서 import될 때, 해당 모듈의 __name__
변수는 모듈 이름과 같습니다.
파이썬에서 if __name__ == ‘__main__’의 예시
이 섹션에서는 if __name__ == '__main__'
조건문의 실제 사용 사례를 살펴보겠습니다. 간단한 함수를 만들고, 이 함수가 예상대로 작동하는지 확인하기 위해 단위 테스트를 작성하는 과정을 통해 이해를 돕겠습니다.
📁 코드를 다운로드하여 따라 해보세요.
이 섹션의 코드는 example-2
폴더에서 찾을 수 있습니다.
여기서 add.py
파일은 add_ab()
함수를 포함하고 있습니다. 이 함수는 두 숫자를 받아 그 합을 반환합니다.
# example-2/add.py def add_ab(a, b): return a + b
파이썬의 unittest
모듈을 사용하여 add_ab()
함수를 테스트할 것입니다.
파이썬 함수에 대한 테스트 케이스 작성
test_add
모듈의 내용을 담은 다음 코드 조각을 살펴보겠습니다.
# example-2/test_add.py import unittest from add import add_ab class TestAdd(unittest.TestCase): def test_add_23(self): self.assertEqual(add_ab(2, 3), 5) def test_add_19(self): self.assertEqual(add_ab(1, 9), 10) def test_add_1_minus7(self): self.assertEqual(add_ab(1, -7), -6)
위 코드는 다음과 같은 작업을 합니다.
- 파이썬 내장 단위 테스트 모듈인
unittest
를 import합니다. add
모듈에서add_ab()
함수를 import합니다.TestAdd
라는 테스트 클래스를 정의하고, 테스트 케이스들을 클래스 내의 메서드로 정의합니다.
코드에 대한 단위 테스트를 설정하려면 먼저 unittest.TestCase
를 상속받는 테스트 클래스를 정의해야 합니다. 모든 테스트 케이스는 클래스 내의 메서드로 정의되어야 하며, 이름은 test_
로 시작해야 합니다.
주의: 메서드 이름을 test_<설명적인 이름>
형태로 지정하지 않으면, 해당 테스트는 인식되지 않으므로 실행되지 않습니다.
이제 터미널에서 test_add
모듈을 실행해 봅시다.
$ python test_add.py
아무런 출력도 없고 테스트가 실행되지 않은 것을 볼 수 있습니다.
왜 그럴까요?🤔
단위 테스트를 실행하려면, test_add.py
를 실행할 때 unittest
를 메인 모듈로 실행해야 합니다. 아래 명령어를 사용해야 합니다.
$ python -m unittest test_add.py
위의 상세 명령어 실행 시, 세 가지 테스트가 모두 성공적으로 실행된 것을 확인할 수 있습니다.
출력 ... ---------------------------------------------------------------------- Ran 3 tests in 0.000s OK
하지만, test_add
모듈이 실행될 때 바로 테스트가 실행되는 것이 더 편리할 것입니다. 그렇지 않나요? 다음 섹션에서 그 방법을 알아보겠습니다.
if __name__ == '__main__'
을 사용하여 unittest
를 메인 모듈로 실행하기
모듈이 직접 실행될 때 모든 단위 테스트를 실행하려면 조건문을 추가할 수 있습니다.
# example-2/test_add.py import unittest from add import add_ab class TestAdd(unittest.TestCase): def test_add_23(self): self.assertEqual(add_ab(2, 3), 5) def test_add_19(self): self.assertEqual(add_ab(1, 9), 10) def test_add_1_minus7(self): self.assertEqual(add_ab(1, -7), -6) # 이 모듈이 직접 실행되는 경우 unittest를 실행합니다. if __name__ == '__main__': unittest.main()
위 코드 조각의 조건문은 파이썬 인터프리터에게 다음과 같이 알려줍니다: 이 모듈이 직접 실행되는 경우에만 내부의 코드 unittest.main()
을 실행하세요.
위의 두 줄의 코드를 추가한 후, test_add
모듈을 실행할 수 있습니다.
$ python test_add.py
▶️ 이제 테스트 추가 모듈을 직접 실행하면, 우리가 정의한 세 가지 테스트가 모두 실행됩니다.
출력 ... ---------------------------------------------------------------------- Ran 3 tests in 0.000s OK
위의 출력에서 OK
는 모든 테스트가 성공적으로 실행되었음을 의미합니다. 세 개의 점 ...
은 세 가지 테스트가 실행되었으며 모두 통과했음을 나타냅니다.
이제 예상 반환 값인 test_add_1_minus7
을 8로 변경해 보겠습니다. 이 경우, 함수는 -6을 반환하므로 하나의 테스트 실패가 있어야 합니다.
def test_add_1_minus7(self): self.assertEqual(add_ab(1, -7), 8)
아래 출력에서 볼 수 있듯이, 세 가지 테스트 중 .F.
가 출력되었고, 그 중 하나는 실패했습니다(두 번째 테스트). 역추적 결과에서 -6 != 8
을 나타내는 AssertionError
를 확인할 수 있습니다.
출력 .F. ====================================================================== FAIL: test_add_1_minus7 (__main__.TestAdd) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_add.py", line 12, in test_add_1_minus7 self.assertEqual(add_ab(1, -7), 8) AssertionError: -6 != 8 ---------------------------------------------------------------------- Ran 3 tests in 0.021s FAILED (failures=1)
주목해야 할 한 가지 중요한 점은 테스트가 반드시 테스트 클래스에 지정된 순서대로 실행되는 것은 아니라는 것입니다. 위 예에서 test_add_1_minus7
은 테스트 클래스의 세 번째 메서드로 정의되어 있지만, 해당 테스트는 두 번째로 실행되었습니다.
정리
이 튜토리얼을 통해 파이썬에서 if __name__ == '__main__'
조건문이 어떻게 작동하는지 이해하는 데 도움이 되었기를 바랍니다.
핵심 내용을 간략하게 요약하면 다음과 같습니다.
- 파이썬 인터프리터는 파이썬 스크립트를 실행하기 전에
__name__
변수를 설정합니다. - 모듈을 직접 실행할 때
__name__
의 값은__main__
입니다. - 다른 파이썬 스크립트 내에서 모듈을 import할 때
__name__
의 값은 모듈 이름입니다. if __name__ == '__main__'
을 사용하여 실행을 제어하고, 직접 실행과 import된 실행에서 각각 실행되는 모듈 부분을 구분할 수 있습니다.
다음으로 파이썬 세트에 대한 이 심층 가이드를 확인해 보세요. 즐거운 학습 되세요!🎉