파이썬 패키지(Package)의 개념
파이썬에서 패키지(package)를 제대로 이해하려면 먼저 모듈(module)에 대한 개념을 알아야 합니다. 파이썬에서는 모든 .py 파일이 하나의 모듈이며, 모듈의 이름은 파일 확장자(.py)를 제외한 파일명, 즉 해당 모듈의 __name__ 속성과 같습니다.
그렇다면 패키지는 무엇일까요? 패키지는 여러 파이썬 모듈을 모아놓은 집합체입니다. 좀 더 구체적으로 말하면, 파이썬 모듈들이 들어 있는 디렉터리(폴더)에 추가로 __init__.py 파일이 포함된 것을 패키지라고 부릅니다.
__init__.py 파일의 역할
__init__.py 파일은 단순히 파이썬 스크립트가 여러 개 들어 있는 일반 디렉터리와 패키지를 구분해 주는 중요한 역할을 합니다. 이 파일이 존재해야 해당 디렉터리가 파이썬이 인식하는 패키지가 됩니다.
또한 패키지는 하위 패키지를 포함할 수 있으며, 각 하위 디렉터리마다 자신만의 __init__.py 파일을 가지고 있다면 원하는 만큼 깊게 중첩(nesting)하는 것도 가능합니다.
모듈과 패키지의 차이점
흥미로운 점은, 모듈이든 패키지든 임포트(import)했을 때 파이썬이 생성하는 객체는 항상 module 타입이라는 사실입니다. 즉, 모듈과 패키지의 구분은 오직 파일 시스템 수준에서만 존재합니다.
다만 주의할 점이 있습니다. 패키지를 임포트하면 그 패키지의 __init__.py 파일 안에 정의된 변수, 함수, 클래스만 직접 사용할 수 있습니다. 하위 패키지나 하위 모듈까지 자동으로 불러와지지 않기 때문입니다.
예제로 확인하는 서브모듈 임포트
예를 들어, datetime 패키지에는 date라는 서브모듈이 있습니다. 패키지 전체를 임포트한다고 해서 이 서브모듈까지 함께 불러와지지는 않으며, 별도로 임포트해야 합니다.
>>> import datetime
>>> date.today()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'date' is not defined
>>> from datetime import date
>>> date.today()
datetime.date(2017, 9, 1)
위 예제에서 볼 수 있듯이, import datetime만 실행한 상태에서는 date 객체에 접근할 수 없어 NameError가 발생합니다. 반면 from datetime import date처럼 명시적으로 임포트하면 date.today() 메서드를 정상적으로 사용할 수 있습니다.
정리
- 모듈: 개별 파이썬 파일(.py)
- 패키지:
__init__.py파일을 포함한 모듈들의 디렉터리 - 패키지를 임포트해도 하위 모듈은 자동으로 로드되지 않으므로 필요한 모듈은 따로 임포트해야 함