파이썬(Python)에서 네임스페이스 패키지(namespace package)는 하나의 파이썬 코드를 여러 프로젝트에 걸쳐 나누어 배포할 수 있게 해주는 기능입니다. 관련된 여러 라이브러리를 각각 별도의 배포판으로 릴리스하고 싶을 때 특히 유용합니다.
네임스페이스 패키지의 기본 구조
예를 들어 PYTHONPATH에 다음과 같이 Package-1과 Package-2 디렉터리가 있다고 가정해 보겠습니다.
Package-1/namespace/__init__.py Package-1/namespace/module1/__init__.py Package-2/namespace/__init__.py Package-2/namespace/module2/__init__.py
이렇게 구성하면 최종 사용자는 아래와 같이 두 모듈을 각각 임포트하여 사용할 수 있습니다.
import namespace.module1 import namespace.module2
Python 3.3 이상: 암시적 네임스페이스 패키지
Python 3.3부터는 별도의 작업 없이 네임스페이스 패키지를 사용할 수 있습니다. 핵심은 네임스페이스 패키지 디렉터리에 __init__.py 파일을 두지 않는 것입니다. 그러면 자동으로 정상 동작합니다.
이것이 가능한 이유는 Python 3.3에서 암시적 네임스페이스 패키지(implicit namespace packages)가 도입되었기 때문입니다. PEP 420에 따라 __init__.py가 없는 디렉터리도 일반 패키지처럼 임포트할 수 있으며, sys.path상의 여러 위치에 흩어져 있는 같은 이름의 디렉터리들이 하나의 네임스페이스로 결합됩니다.
구버전 Python: pkgutil 활용하기
Python 3.3 미만 버전에서는 표준 모듈인 pkgutil을 사용해 특정 네임스페이스에 모듈을 '추가'할 수 있습니다. Package-1과 Package-2 양쪽의 __init__.py 파일에 다음 두 줄을 넣어야 합니다.
# Package-1/namespace/__init__.py 및 Package-2/namespace/__init__.py from pkgutil import extend_path __path__ = extend_path(__path__, __name__)
extend_path() 함수는 sys.path에 있는 디렉터리들 중 해당 패키지 이름과 일치하는 하위 디렉터리를 모두 찾아 패키지의 __path__에 추가해 줍니다.
정리
이 설정을 마치면 두 패키지를 서로 독립적으로 배포할 수 있습니다. 즉, 사용자는 필요한 모듈만 골라서 설치하더라도 동일한 namespace 네임스페이스 아래에서 문제없이 함께 동작하게 됩니다.