모듈(Module)

2023. 2. 9. 18:58코딩/파이썬

파이썬을 공부하는 사람들이라면 한번쯤은 다음과 같은 코드를 본 적이 있을 것이다.
import sys

이 코드의 의미는 'sys'모듈을 이 소스파일에 불러온다는 뜻이다. sys는 파이썬 설치 시 같이 설치되는 라이브러리 모듈인데, 파이썬 모듈에 대한 설명은 다음에 자세히 하고, 오늘은 모듈과 패키지의 개념만 알아보자.


모듈

모듈이란?

클래스, 함수, 변수 등을 포함한 python 파일이다. 즉, 그냥 파이썬 파일을 따로 빼놓은 것

코드를 짜면서 이런저런 함수나 클래스들이 많아지면 보기 좀 더럽기도 하고, 나중에 다른 프로젝트에서 필요할 때

해당 부분을 찾아서 복붙해야하는 불편함이 있는데, 이런 불편함을 해소시켜주는게 모듈이다. 

 

다음 모듈은 반지름을 인수로 받아 원의 넓이와 지름을 계산하는 클래스를 포함한다.

#mcircle.py

PI = 3.14

class Circle:
    def __init__(self,r):
        self.r = r

    def carea(self):
        return PI*self.r*self.r

    def cdiameter(self):
        return 2*PI*self.r

 

모듈 불러오기

_test_package.py에서 Circle 클래스의 메서드들을 쓰려면 mcircle을 import 해줘야 한다.

mcircle.py는 _test_package.py와 같은 디렉토리에 있어야 한다.

#_test_package.py
import mcircle

c1 = mcircle.Circle(3)
area = c1.carea()
diameter = c1.cdiameter()
print(f"원 넓이 : {area}, 원 지름 : {diameter}")

이제 mcircle 모듈에 있는 메서드와 클래스, 전역 변수인 PI도 _test_package.py에서 쓸 수 있다.

디버그를 통해 어떻게 작동하는지 살펴보자.

line 3에 브레이크 포인트를 걸고 ..

먼저 line 3이다. c1에 Circle클래스를 대입하기 전이다.

<사진1>c1 부분으로 넘어가기 전, 메인쓰레드는 _test_package.py다.

 mcircle 파일의 Circle 클래스에 r = 3이 전달되었다.

<사진2>c1에 mcircle.py의 클래스를 저장하기 위해 메인쓰레드가 mcircle.py로 변경됨

다음으로 넘어가면 c1에 mcircle.Circle이 저장된 것을 볼 수 있다.

<사진3>c1에 mcircle.Circle이 저장되며 다시 _test_package.py로 돌아옴

line 4, area = ... 부분이다. carea( )함수에서 결과값을 받기 위해 mcircle.py로 이동했다.

<사진4> 

 area에 값이 저장되며 _test_package.py로 돌아왔다.

이제 import된 모듈이 어떻게 쓰이는지 감이 올 것이다.


두번째 코드블럭을 보면 mcircle의 Circle 클래스를 사용하기 위해 mcircle.Circle( )의 형태를 취하고 있다.

mcircle.을 빼고싶다면 다음과 같이 하면 된다.

#_test_package.py
from mcircle import Circle

c1 = Circle(3)

mcircle 모듈의 Circle 클래스를 사용하겠다는 뜻이다.

만약 mcircle 모듈에 Square라는 클래스가 있고, Circle과 Square을 둘 다 사용하고싶다면?

#1. 두 클래스(또는 메서드)나열하기
from mcircle import Circle, Square

#2. 모듈에 있는 모든 것을 쓴다고 명시
from mcircle import *

*은 파이썬 정규식으로 '모든 것'을 나타내는데, 정규식에 대해서는 나중에 알아볼 예정이다.

만약 import할 요소의 이름을 바꾸고 싶다면 다음과 같이 한다.

from mcircle import Circle as shape
이름을 shape으로 바꿔 Circle대신 shape(3)으로 쓴다.

 

__name__ = "__main__"

모듈을 아래와 같이 수정했다. 다른 것은 모두 같고 아래 위에 print( ) 함수만 추가한 것이다.

print("모듈 mcircle")
PI = 3.14

..............

if __name__ == "__main__":
    print("if문 안 구문")

실행결과는 다음과 같다.

if문 안에 있는 print( )함수는 동작하지 않고, 맨 위에 있는 print( )함수의 구문만 출력되었다. 왜 그런 것일까?

__name__ 변수는 파이썬의 내장 변수로, 모듈의 이름을 담는다. 그런데 모듈 파일에서 해당 모듈을 실행하면  __name__변수에는 모듈의 이름이 담기지만 다른 파일에서 해당 모듈을 불러서 사용할 경우엔 __main__값이 담긴다. 

즉, if문의 의미는 mcircle파일에서 직접 실행할 때만 print하라~ 라는 뜻이 되겠다.

헷갈린다면 직접 디버깅으로 확인해보자.

mcircle을 import하는 부분에서 mcircle.py로 넘어가며 __name__변수에 모듈이름이 담겼다.
모듈 파일에서 직접 실행했을 땐 __name__ 변수에 __main__이 담겨있다.

다른 디렉토리에 있는 파일에서 모듈 불러오기

여태까지는 같은 모듈이 실행하는 파일과 같은 디렉토리에 있어야 했다.

다른 경로에 있는 파일에서도 모듈을 불러보자.

C:\pymodules\square.py파일을 다음과 같이 작성한다.

class Square:
    def __init__(self,a,b):
        self.a = a
        self.b = b

    def sarea(self):
        return self.a*self.b

이 모듈을 이제 _test_package.py에서 사용하려면 모듈이 있는 경로를 지정해줘야 한다.

방법은 두가지가 있다.

1. sys.path에 경로 추가하기

   파이썬 내장모듈인 sys를 사용하면 파이썬 라이브러리가 설치된 디렉토리를 확인할 수 있다.

   (라이브러리는 패키지의 모음이며, 패키지는 모듈의 모음이다)

   파이썬 콘솔에서 확인해보자.

이 path에 모듈의 경로를 추가해주면 된다.

import sys
sys.path.append("C:\pymodules")
모듈이 들어있는 경로가 추가됐다.

이제 _test_package.py에서 square 모듈을 불러올 수 있다.

문제없이 square모듈의 클래스와 메서드를 사용할 수 있었다.

 

2. 환경변수 사용하기

두 번째 방법은 PYTHONPATH환경변수에 모듈이 있는 디렉토리를 추가해주는 것이다.

터미널에 set PYTHONPATH=디렉토리경로를 입력한다. 띄어쓰기가 있으면 에러가 날 수도 있으니 주의하자.

set PYTHONPATH=C:\pymodules

마지막으로 파일 이름을 test_package로 했을 때 다음과 같은 에러가 떳었다. test에 무슨 기능이 있는 것 같다.

파일 이름을 _test_package로 바꾸면 정상 작동한다.

 

 
 
 

 

'코딩 > 파이썬' 카테고리의 다른 글

파이썬 데이터프레임(Dataframe)  (0) 2023.02.09
딕셔너리(Dictionary)  (0) 2023.02.09
리스트(List)  (0) 2023.02.09
사용차 입출력  (0) 2023.02.09
객체와 변수  (0) 2023.02.09