Python

[python][basic] module, package 이해하기

module이란? 

함수나 변수 또는 클래스를 모아 놓은 파일로, 이미 만들어져 있고 안정성이 검증된 함수들을 성격에 맞게 하나의 파이썬 파일에 묶어 놓은 것을 모듈이라고 한다. 이미 만들어진 모듈이 있다면 또 만들기보다는 이를 활용하면 보다 효율적이고 빠르게 개발할 수 있기 때문에 우리는 다른 사람들이 이미 만들어 놓은 모듈을 사용할 수도 있고 우리가 직접 만들어 재사용할 수도 있다.

외부 모듈에 있는 함수들을 활용하려면 이 모듈을 먼저 우리 코드로 가져와야하는데 이를 모듈을 import한다라고 말한다.

import time

print('5초간 프로그램을 정지합니다.')
time.sleep(5)
print('5초가 지나갔습니다.')

위 코드는 파이썬 내장 모듈인 time 모듈을 import키워드를 통해 내 코드로 임포트한 것이다. 아마 time 모듈에는 시간과 관련된 여러 함수가 정의되어 있을 것이고, sleep()이라는 함수는 프로그램을 해당 시간만큼 멈추는 함수일 것이다. time모듈이 제공하는 함수를 사용하려면  time.sleep()과 같이 함수 이름 앞에 모듈 이름을 명시해야 한다.

우리가 만드는 유용한 함수 또한 다른 사람이 사용할 수 있도록 파이썬 모듈로 만들 수 있다. 아래처럼 하나의 py파일 안에 관련 함수를 정의하고 저장한 후 같은 디렉토리에서 이 모듈을 import해서 함수를 사용하면 된다. 

# mylib.py

def add_txt(t1,t2):
	return t1+ ":" +t2
    
def reverse(x,y,z):
	return z,y,x
import mylib

ret1 = mylib.add_txt('대한민국', '1등')
ret2 = mylib.reverse(1,2,3)

print(ret1) # '대한민국:1등'
print(ret2) # (3,2,1)

package란? 

파이썬 모듈을 계층적인 디렉터리 형태로 구성한 것을 파이썬 패키지라 한다. 디렉터리를 파이썬 패키지로 인식하게 하려면 계층적으로 이루어져 있는 각 디렉터리마다 __init__.py 라는 이름의 파일이 있어야 한다.  __init__.py파일은 패키지로 인식시키기 위한 용도임으로 안에 내용이 없어도 되고 보통은 version=1.0과 같이 텍스트 한 줄만 있어도 된다.

패키지를 만드는 순서는 아래와 같다.

  1. mypackage라는 디렉터리를 만듬
  2. mypackage 디렉터리로 이동해서 mylib.py를 mypackage 디렉터리로 복사
  3. mypackage폴더에 version=1.0이 내용인 __init__.py 파일을 생성
  4. 서브 디렉터리를 생성한 후 서브 디렉터리에 하위 패키지를 구성하려면 위의 1~3까지를 동일하게 진행

패키지를 구성하고 나면 mypackage를 이제 사용할 차례이다. 우리의 소스코드가 있는 디렉터리로 mypackage 디렉터리 전체를 복사해온다. mypackage.mylib을 임포트해온다. 이제는 mypackage에 있는 mylib 모듈의 reverse()를 호출할 수 있다.

import mypackage.mylib

ret1 = mypackage.mylib.add_txt('대한민국','1등')
ret2 = mypackage.mylib.reverse(1,2,3)

import 방법

기본적인 import방식은 다음과 같다.

import module이름
import package이름.module이름

 이렇게 매번 모듈 이름또는 패키지의 복잡한 계층구조까지 함께 적어주기 힘들기 때문에 아래와 같은 여러 import 방식이 있다,

from time import sleep
from time import *
from package이름 import module이름

위처럼 from module이름 import 함수 이름 이렇게 정의하면 모듈 이름을 붙이지 않고도 해당 모듈의 함수를 바로 사용할 수 있다.  2번째 줄처럼 * 문자를 사용하면 time모듈에 정의된 모든 함수를 불러오겠다라는 의미.

from time import sleep
from mypackage import mylib
from mypackage.mylib import reverse

sleep(1) # time module의 sleep 함수 호출
mylib.add_txt('나는', '학생입니다') # mypackage.mylib module의 add_txt 함수 호출
reverse(1,2,3) # mypackage.mylib module의 reverse 함수 호출

mypackage.mylib처럼 이 함수가 포함된 패키지의 계층구조를 모두 적어야하는 것은 꽤나 번거로운 일이다. 그래서 다음과 같은 방식으로 이 모듈에 별명을 붙여 간단하게 호출할 수 있다.

import 이름이 긴 모듈명 as 별명
import numpy as np
import mypackage as mp
import mypackage.mypib as ml

ret1 = mp.mylib.add_txt('대한민국', '1등')
ret2 = ml.reverse(1,2,3)

mp.mylib.add__txt()는 mypackage.mylib.add_txt()와 동일하게 취급된다. ml.reverse()는 mypackage.myplib.reverse()와 같음