모든 파이썬 파일은 하나의 모듈(module)입니다. 모듈의 이름은 파일의 기본 이름, 즉 .py 확장자를 제외한 이름이며, 이는 모듈의 __name__ 속성으로 확인할 수 있습니다.
패키지(package)는 파이썬 모듈들의 집합입니다. 즉, 여러 파이썬 모듈을 담고 있는 디렉터리에 추가로 __init__.py 파일이 포함된 형태를 말합니다. 이 __init__.py 파일의 존재 여부가 단순히 파이썬 스크립트 몇 개를 모아둔 일반 디렉터리와 패키지를 구분하는 기준이 됩니다. 또한 각 하위 디렉터리마다 자체적인 __init__.py 파일만 갖춰져 있다면, 패키지는 원하는 만큼 깊게 중첩될 수 있습니다.
임포트 시 생성되는 객체의 타입
모듈이든 패키지든 임포트(import)하면 파이썬이 생성하는 객체의 타입은 항상 module입니다. 다시 말해, 모듈과 패키지의 구분은 오직 파일 시스템 수준에서만 존재하며, 코드상에서는 동일하게 취급된다는 의미입니다.
다만 주의할 점이 있습니다. 패키지를 임포트하더라도 해당 패키지의 __init__.py 파일 안에 정의된 변수, 함수, 클래스만 직접 접근할 수 있으며, 하위 패키지나 하위 모듈까지 자동으로 임포트되지는 않습니다.
datetime 모듈 예제
예를 들어 datetime 모듈에는 date라는 서브모듈(하위 모듈)이 포함되어 있습니다. 하지만 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)
위 예제처럼 상위 모듈만 임포트하면 NameError가 발생하지만, from datetime import date와 같이 명시적으로 임포트하면 정상적으로 사용할 수 있습니다.