45.3 패키지 만들기

이번에는 패키지를 만들어보겠습니다. 모듈은 스크립트 파일이 한 개지만 패키지는 폴더(디렉터리)로 구성되어 있습니다.

지금부터 만들 패키지의 폴더 구성은 다음과 같습니다.

그림 45-5 패키지 폴더 구성

먼저 프로젝트 폴더(C:\project) 안에 calcpkg 폴더를 만듭니다. 그리고 다음 내용을 calcpkg 폴더 안에 __init__.py 파일로 저장하세요.

calcpkg/__init__.py

# __init__.py 파일은 내용을 비워 둘 수 있음

폴더(디렉터리) 안에 __init__.py 파일이 있으면 해당 폴더는 패키지로 인식됩니다. 그리고 기본적으로 __init__.py 파일의 내용은 비워 둘 수 있습니다(파이썬 3.3 이상부터는 __init__.py 파일이 없어도 패키지로 인식됩니다. 하지만 하위 버전에도 호환되도록 __init__.py 파일을 작성하는 것을 권장합니다).

45.3.1  패키지에 모듈 만들기

이제 calcpkg 패키지에 모듈을 두 개를 만들겠습니다. 첫 번째 모듈은 덧셈, 곱셈 함수가 들어있는 operation 모듈이고, 두 번째 모듈은 삼각형, 사각형의 넓이 계산 함수가 들어있는 geometry 모듈입니다.

먼저 다음 내용을 calcpkg 폴더 안에 operation.py 파일로 저장하세요.

calcpkg/operation.py

def add(a, b):
    return a + b
 
def mul(a, b):
    return a * b

그리고 다음 내용을 calcpkg 폴더 안에 geometry.py 파일로 저장하세요.

calcpkg/geometry.py

def triangle_area(base, height):
    return base * height / 2
 
def rectangle_area(width, height):
    return width * height

45.3.2  패키지 사용하기

이제 스크립트 파일에서 패키지의 모듈을 사용해보겠습니다. 다음 내용을 프로젝트 폴더(C:\project) 안에 main.py 파일로 저장한 뒤 실행해보세요(main.py 파일을 calcpkg 패키지 폴더 안에 넣으면 안 됩니다).

  • import 패키지.모듈
  • 패키지.모듈.변수
  • 패키지.모듈.함수()
    • 패키지.모듈.클래스()

    main.py

    import calcpkg.operation    # calcpkg 패키지의 operation 모듈을 가져옴
    import calcpkg.geometry     # calcpkg 패키지의 geometry 모듈을 가져옴
     
    print(calcpkg.operation.add(10, 20))    # operation 모듈의 add 함수 사용
    print(calcpkg.operation.mul(10, 20))    # operation 모듈의 mul 함수 사용
     
    print(calcpkg.geometry.triangle_area(30, 40))    # geometry 모듈의 triangle_area 함수 사용
    print(calcpkg.geometry.rectangle_area(30, 40))   # geometry 모듈의 rectangle_area 함수 사용
    

    실행 결과

    30
    200
    600.0
    1200
    

    calcpkg 패키지의 operation 모듈과 geometry 모듈을 가져와서 안에 들어있는 함수를 호출했습니다.

    이처럼 패키지의 모듈을 가져올 때는 import 패키지.모듈 형식으로 가져옵니다. 그리고 패키지.모듈.함수() 형식으로 모듈의 함수를 사용합니다(변수와 클래스도 같은 형식).

    45.3.3  from import로 패키지의 모듈에서 변수, 함수, 클래스 가져오기

    물론 패키지의 모듈에서 from import로 함수(변수, 클래스)를 가져온 뒤 패키지와 모듈 이름을 붙이지 않고 사용할 수도 있습니다.

    • from 패키지.모듈 import 변수
    • from 패키지.모듈 import 함수
    • from 패키지.모듈 import 클래스

    다음은 calcpkg 패키지의 operation 모듈에서 add, mul 함수를 가져옵니다.

    >>> from calcpkg.operation import add, mul
    >>> add(10, 20)
    30
    >>> mul(10, 20)
    200
    

    지금까지 만든 main.py 스크립트 파일과 calcpkg 패키지의 계층을 그림으로 나타내면 다음과 같은 모양이 됩니다. main.py 파일이 있는 폴더에 calcpkg 패키지가 있고, calcpkg 패키지의 폴더 안에 __init__.py, operation.py, geometry.py 파일이 들어있습니다.

    그림 45-6 calcpkg 패키지의 계층
    참고 | 패키지의 모듈과 __name__

    패키지의 모듈에서는 __name__ 변수에 패키지.모듈 형식으로 이름이 들어갑니다. 즉, calcpkg 패키지의 geometry.py에서 __name__의 값을 출력하도록 만들고, import로 가져오면 'calcpkg.geometry'가 나옵니다.

    참고 | 모듈과 패키지를 찾는 경로

    지금까지 모듈과 패키지는 현재 폴더(디렉터리)에 만들었습니다. 파이썬에서는 현재 폴더에 모듈, 패키지가 없으면 다음 경로에서 모듈, 패키지를 찾습니다.

    >>> import sys
    >>> sys.path
    ['C:\\project', 
    'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\Lib\\idlelib',  'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\python36.zip',  'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\DLLs', 'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\lib', 'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32', 'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\site-packages']
    

    sys 모듈의 path 변수에는 모듈, 패키지를 찾는 경로가 들어있습니다. 여기서 site-packages 폴더에는 pip로 설치한 패키지가 들어갑니다. 그리고 자기가 만든 모듈, 패키지도 site-packages 폴더에 넣으면 스크립트 파일이 어디에 있든 모듈, 패키지를 사용할 수 있습니다.

    만약 가상 환경(virtual environment)를 만들어서 모듈과 패키지를 관리한다면 가상환경/Lib/site-packages 폴더에 모듈과 패키지가 들어갑니다. 자세한 내용은 '부록 47.11 가상환경 사용하기'를 참조하세요.