패키지는 "점으로 구분된" 파이썬 모듈의 네임스페이스 구조를 사용하는 방법입니다. 모듈 이름 A.B는 A라는 패키지 안의 모듈 B를 의미합니다. 이렇게 점으로 구분된 모듈을 쓰면 NumPy나 Python 이미지 라이브러리 같이 다중 모듈 패키지에서 모두 다른 이름을 쓰는 것을 걱정하지 않아도 됩니다.
소리 파일이나 데이터를 다루는 패키지를 만들고자 합니다. 다양한 소리 파일 포맷(wav, aiff, au)들이 있기 때문에, 다양한 모듈을 수집하여 패키지를 성장시키고 유지시켜야 할 것입니다. 소리 데이터로 할 수 있는 많은 기능(믹싱, 에코 추가, 이퀄라이저 등)들이 있어서, 당신은 이 작업을 수행하기 위해 끝없는 모듈의 흐름을 작성하게 될 것입니다. 여기 당신의 패키지에 대한 가능한 구조(계층적 파일 시스템으로 표현된)가 있습니다.
sound/ Top-level package
__init__.py Initialize the sound package
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
패키지를 설치할 때, 파이썬은 sys.path로 지정된 디렉토리의 하위에서 패키지를 찾습니다.
__init__.py 파일은 파이썬이 디렉토리를 포함된 패키지로서 처리하도록 요청한다. string과 같은 일반 이름을 가진 현재의 디렉토리가 이후의 모듈 검색패스에서 발생하지 않도록 막아줍니다. 간단한 경우로 __init__.py는 단지 빈 파일이지만 나중에 설명할 패키지의 초기화 코드를 실행하거나 __all__ 변수를 설정할 수 있습니다.
패키지의 사용자는 패키지에서 하나의 모듈도 설치할 수 있습니다.
import sound.effects.echo
sound.effects.echo를 불러옵니다. 이것은 반드시 전체 이름으로 참조되어야 합니다.
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
하위 모듈을 실행시키는 다른 방법도 있습니다.
from sound.effects import echo
이걸로 하위모듈 echo를 불러오고, 패키지 프리픽스 없이 그것을 사용가능하게 만들려면 아래와 같이 해야 합니다.
echo.echofilter(input, output, delay=0.7, atten=4)
또 다른 방법은 원하는 기능이나 변수를 직접적으로 실행하는 것입니다.
from sound.effects.echo import echofilter
이걸로 하위 모듈 echo를 불러오면, 직접적으로 echofilter() 기능을 사용할 수 있습니다.
echofilter(input, output, delay =0.7, atten =4)
from packages import item을 쓸 때, 항목은 패키지의 하위 모듈이거나 함수, 클래스, 변수와 같은 패키지에서 정의된 다른 이름이어야 합니다. import 구문은 가장 먼저 항목이 패키지에서 정의되었는지를 확인합니다. 그렇지 않으면 모듈이라 가정하고, 모듈을 로드하려 시도합니다. 찾지 못하면 importError가 발생합니다.
반대로 import item.subitem.subsubitem과 같은 구문을 사용할 때, 마지막을 제외한 항목은 패키지여야 하비다. 마지막 항복은 모듈이나 패키지가 될 수 있지만, 이전 항복에서 정의된 함수나 클래스, 변수는 될 수 없습니다.
from packages import *를 쓰면 패키지에 있는 모든 서브 모듈을 가져오기를 원하지만, 이것은 오랜 시간이 걸리고 명시된 하위 모듈만 가져올 때 발생하는 오류가 발생할 수 있습니다. 유일한 해결책은 패키지 작성자가 패키지의 명시적인 색인을 제공하는 것입니다. import 구문은 다음과 같이 쓰입니다. 패키지의 __init__.py 코드가 __all__.py라는 이름의 리스트를 정의하면, *로 정의한 것과 같은 의미가 됩니다. 새 패키지 버전이 풀렸을 때 목록을 최신 생태로 유지하는 것은 패키지 작성자가 해야할 일입니다. 만약 *를 임포트 하는 사용법을 그들이 보지 않았다면, 패키지 작성자는 또한 그것을 제공하지 않을 수도 있습니다. 파일 sound/effects/__init__.py는 아래의 코드를 포함합니다.
from sound.effects import * 는 sound 패키지에서 위의 세가지 하위 모듈을 실행하는 것을 의미입니다.
만약 __all__이 정의되 않았다면, from sound.effects import * 는 모든 하위 모듈을 불러오지 못합니다. 이는 단지 sound.effects 패키지가 임포트된 후 (__init__.py에 초기화 코드가 있을 가능성), 패키지에 정의된 이름을 가져옵니다. 이것은 __init__.py에 의해 정의된(하위 모듈이 명시적으로 로드된) 이름을 포함합니다. 또 이전의 import 구문으로 로드된 패키지의 하위 모듈도 포함합니다.
import sound.effects.echo
import sound.effects.surround
from sound.effects import *
이 예시에서 echo와 surround 모듈은 현재의 네임스페이스에 임포트 되었습니다. 이것들이 from ... import ... 구문이 실행될 때 sound.effects 패키지에서 정의되었기 때문입니다. (__all__이 정의될 때도 같습니다.)
특정 모듈이 가져오기 *를 사용할 때, 특정패턴을 따르는 이름만 내보내도록 설계되어 있지만, 여전히 프로덕션 코드에서는 나쁜 습관으로 여겨집니다.
from Package import specific_submodule을 쓰는 것은 문제가 없습니다. 사실, 실행되는 모듈이 다른 패키지에서 같은 이름의 하위모듈을 써야되는 경우가 아니면 권장되는 방법입니다.
패키지 내부 참조 (Intra-package Reference)
패키지들이 하위 패키질 구성되는 경우, 형제 패키지의 서브 모듈을 참조하는 절대 실행을 사용할 수 있습니다. sound.filters.vocoder가 sound.effects.패키지의 echo를 써야 한다면, from sound.effects import echo라고 쓰면 됩니다.
from module import name은 상대 실행을 의미합니다. 이것은 점을 이용하여 상대 실행을 포함하고 있는 현재나 상위 패키지를 나타냅니다.
from . import echo
from .. import formats
from ..filters import equailzer
상대 경로 실행은 현재 모듈의 이름에 기반합니다. 메인 모듈의 이름은 항상 __main__이기 때문에, 파이썬에서 메인 모듈을 이용하기 위한 모듈은 항상 절대 경로 실행을 가집니다.
여러 디렉토리의 패키지들(Multiple Directories)
패키지는 하나 이상의 특별한 속성인 __path__를 지원합니다. 이것은 파일에 있는 코드가 실행되기 전에 패키지의 __init__.py를 가지고 디랙터리의 이름을 가진 리스트를 초기화 시킵니다. 변수도 수정할 수 있습니다. 이렇게 하면, 패키지 속의 하위 패키지나 모듈을 검색하는데 영향을 미칩니다. 이런 상황이 자주 필요하진 않지만, 패키지에 설치된 모듈의 세트를 확장하기 위해서 사용되곤 합니다.