본문 바로가기
파이썬/기초 문법

[파이썬]모듈 - 만들기, 불러오기, if __name__ == "__main__"

by 코키드 Cokid 2022. 10. 14.
반응형

이번 포스팅에선 모듈 만들기, 불러오기, if__name__ == "__main__":의 의미에 대해 포스팅한다.

모듈은 주로 변수와 함수, 클래스 등을 모아 놓은 파이썬 파일이다. 다만 직접 실행시키기 위한 파일이 아니라 다른 파이썬 프로그램에서 불러와 활용할 수 있게끔 만든 파이썬 파일을 말한다.

모듈은 왜 필요할까? 하나의 파이썬 파일에 수많은 함수와 클래스를 만들어 놨다고 상상해보면 코드가 지저분해지고 가독성이 떨어질 것이다. 모듈을 통해서 내가 작업하는 메인 파이썬 파일을 깔끔하게 유지할 수 있다.

그리고 자주 사용하는 기능들을 모듈로 만들어서 필요할 때 언제든 불러올 수 있다는 장점도 있다.

 

모듈 만들기

모듈에 대해 얘기하기 전에 두 수를 받아 사칙연산을 하는 클래스를 만들어 보자.

사칙 연산 클래스를 너무 자주 사용해서 새로운 프로그램을 만들 때마다 매번 클래스를 만드는 것이 번거롭다.

이럴 때 모듈이 필요한데, 모듈을 만드는 것은 매우 간단하다. 이 클래스가 담긴 파이썬 파일을 만들어주면 된다.

module_test.py
class cal_nums():
    def __init__(self, a, b):
        self.a = a
        self.b = b
    def add(self):
        result = self.a + self.b
        return result
    def sub(self):
        result = self.a - self.b
        return result
    def mul(self):
        result = self.a * self.b
        return result
    def div(self):
        result = self.a / self.b
        return result

class cal_squa():
    def __init__(self, a, b):
        self.a = a
        self.b = b
    def squa(self):
        result = self.a ** self.b
        return result

사칙연산 클래스가 담긴 모듈을 module_test.py 파일명으로 저장했다. 모듈 만들기는 이게 끝이다. 확장자에 주의하자.

 

위 클래스의 내용이 이해되지 않는다면 이전 포스팅을 참고하자.

2022.10.13 - [파이썬/기초 문법] - [파이썬]클래스(class) - 구조, 객체, 생성자, 상속, 오버라이딩

 

모듈 불러오기 - import

모듈 불러오기

사칙연산 클래스가 담긴 모듈 module_test.py를 불러와보자.

모듈을 사용하기 위해서는 모듈이 있는 폴더에 파이썬 파일을 만들어야 한다.

#use_mod.py
import module_test

모듈을 불러오기 위해서는 import 명령어를 사용한다. import 뒤에 모듈 파일명을 적어주면 된다.

다만 import는 파이썬 확장자 파일을 불러오기 때문에 확장자명 py는 생략한다. py를 붙이면 에러가 출력된다.

 

그럼 불러온 모듈을 활용해서 모듈 내의 사칙연산 클래스를 사용해보자.

import module_test

cal1 = module_test.cal_nums(2, 4)
print(cal1.add())

cal2 = module_test.cal_squa(2, 3)
print(cal2.squa())

클래스가 모듈 module_test에 있기 때문에 모듈의 클래스를 불러올 때는 모듈명을 적어주고 도트연산자를 입력한 뒤 클래스를 불러와야 한다.

결과를 출력해보자

#결과 출력
6
8

모듈을 통해 불러온 두 개의 클래스가 모두 제대로 작동되는 것을 확인할 수 있다.

 

다른 위치에 있는 모듈 불러오기

모듈을 불러오기 위해서는 현재 작업하는 파이썬 파일이 모듈과 같은 위치에 있어야 한다. 하지만 같은 위치에 없는 모듈도 불러올 수 있다. 대화형 인터프리터에서 다음 코드를 실행해보자.

>>> import sys
>>> sys.path
#결과 출력
['', 'C:\\Users\\COKID\\anaconda3\\python39.zip', 'C:\\Users\\COKID\\anaconda3\\DLLs', 'C:\\Users\\COKID\\anaconda3\\lib', 'C:\\Users\\COKID\\anaconda3', 'C:\\Users\\COKID\\anaconda3\\lib\\site-packages', 'C:\\Users\\COKID\\anaconda3\\lib\\site-packages\\win32', 'C:\\Users\\COKID\\anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\Users\\COKID\\anaconda3\\lib\\site-packages\\Pythonwin']

sys 모듈은 파이썬을 설치할 때 내장되어있는 모듈이다. sys.path는 파이썬 모듈들이 설치되어 있는 위치를 리스트 형태로 보여준다. 만약 저 위치들에 모듈이 있다면 같은 위치가 아니더라도 모듈을 불러올 수 있다.

하지만 굳이 저 위치가 아니어도 내가 원하는 폴더에 모듈을 저장하여 불러올 수도 있다.

테스트로 바탕화면의 폴더에 모듈을 저장하여 불러와보자.

sys.path의 반환값은 리스트이기 때문에 append 함수로 간단하게 값을 추가할 수 있다. sys.path 리스트에 바탕화면에 새로 만든 폴더의 위치를 추가해준 뒤 모듈을 호출하면 내가 원하는 위치에서 모듈을 호출할 수 있다.

import sys
sys.path.append('C:/Users/COKID/Desktop/modules') # 바탕화면의 폴더에 module 사용

print(sys.path)
import module_test as mod

cal1 = mod.cal_nums(2, 4)
print(cal1.add())

cal2 = mod.cal_squa(2, 3)
print(cal2.squa())

 

모듈에서 일부 클래스만 불러오기 - import

사칙연산 모듈에는 사칙연산 클래스와 제곱을 하는 클래스가 있는데, 이 중 하나의 클래스만 불러올 수도 있다.

from 모듈 import 클래스의 형태로 불러오면 된다.

from module_test import cal_squa

cal2 = cal_squa(2, 3)
print(cal2.squa())

from을 통해 특정 클래스만 불러올 때는 모듈명을 적지 않고 바로 클래스를 사용할 수 있다.

만약 모든 클래스를 모듈명을 적지 않고 사용하고 싶을 때는 *문자를 사용하면 된다.

from module_test import *

cal1 = cal_nums(2, 4)
print(cal1.add())

cal2 = cal_squa(2, 3)
print(cal2.squa())

*문자는 모든 것을 의미하는데 from module_test import *를 통해서 두 클래스 모두 모듈명 없이 사용할 수 있다.

 

다른 이름으로 모듈 불러오기 - as

우리가 만든 모듈명이 너무 길어서 짧게 줄여서 불러오고 싶을 때는 as를 쓰면 된다.

module_test의 이름이 너무 길어 mod로 사용하고 싶다면 import module_test as mod 형태로 사용하면 된다.

import module_test as mod

cal1 = mod.cal_nums(2, 4)
print(cal1.add())

cal2 = mod.squa(2, 3)
print(cal2.squa())

코드를 실행해보면 결과가 제대로 출력된다.

 

if __name__ ==  "__main__":  의미

모듈 포함된 사칙연산 클래스가 제대로 작동하는지 모듈을 불러오기 전에 확인하고 싶을 때는 모듈 내에서 간단한 테스트 코드를 실행해보면 될 것이다. 아래 예문을 보자.

class cal_nums():
    def __init__(self, a, b):
        self.a = a
        self.b = b
    def add(self):
        result = self.a + self.b
        return result
    def sub(self):
        result = self.a - self.b
        return result
    def mul(self):
        result = self.a * self.b
        return result
    def div(self):
        result = self.a / self.b
        return result

class cal_squa():
    def __init__(self, a, b):
        self.a = a
        self.b = b
    def squa(self):
        result = self.a ** self.b
        return result

test1 = cal_nums(2, 2) # 간단한 테스트 코드
print(test1.add())

test2 = squa(2, 3)
print(test2.squa())
#결과 출력
4
8

결과를 출력하면 클래스 내의 함수들이 제대로 작동하는 것을 볼 수 있다. 그럼 이렇게 테스트 코드가 포함된 모듈을 불러와보자.

import module_test
#결과 출력
4
8

테스트 코드가 포함된 모듈은 불러오기만 해도 테스트 코드가 출력되어 버린다. 우리가 원하는 상황은 모듈 파일에서는 테스트 코드가 실행이 되고 다른 파일에서 모듈을 불러올 때는 테스트 코드가 실행되지 않는 것이다.

이런 상황을 해결하기 위해 if __name__ == "__main__": 구문이 필요한 것이다.

테스트 코드 부분만 따로 떼서 봐 보자.

if __name__ == "__main__":
    test1 = cal_nums(2, 2)
    print(test1.add())

    test2 = cal_squa(2, 3)
    print(test2.squa())

테스트 코드 부분을 위와 같이 if __name__ == "__main__": 구문과 함께 사용하면 모듈을 직접 실행할 때는 if문이 실행되지만 다른 파일에서 모듈을 부를 때는 if문이 실행되지 않아 테스트 코드가 실행되지 않는다.

__name__ 변수는 특이한 성질이 있다. 만약 module_test.py 파일을 직접 실행하면 __name__변수에는 '__main__'값이 저장이 되고 다른 파일에서 module_test.py를 불러오면 __name__변수에는 'module_test'값이 저장된다.

따라서 if __name__ == "__main__": 구문을 사용하면 모듈을 불러올 때 테스트 코드가 포함된 if문이 실행되지 않는다.

 

반응형

댓글