패키지 - 파이썬

찌니·2021년 3월 14일

점프투파이썬 참고

패키지(Packages)란?

: 패키지는 도트(.)를 사용해 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해준다.
파이썬 패키지는 디렉터리와 파이썬 모듈로 이루어진다.

  • 모듈이름 : A.B
  • A : 패키지 이름
  • B : A패키지의 B모듈

  • game, sound, graphic, play는 디렉터리 이름이고 확장자가 .py인 파일은 파이썬 모듈이다. game 디렉터리가 이 패키지의 루트 디렉터리이고 그 외는 서브 디렉터리이다.

  • 간단한 파이썬 프로그램이 아니라면 이렇게 패키지 구조로 파이썬 프로그램을 만드는 것이 공동 작업이나 유지 보수 등 여러 면에서 유리하다. 또한 패키지 구조로 모듈을 만들면 다른 모듈과 이름이 겹치더라도 더 안전하게 사용할 수 있다.

패키지 만들기


패키지 안의 함수를 실행하는 방법은 3가지가 있다.

  • 인터프리터 실행 후 import 하기 (인터프리터 종료 ctrl+z)

  • import game을 수행하면 game 디렉터리의 모듈 또는 game 디렉터리의 __init__.py에 정의한 것만 참조할 수 있다.
  • 도트 연산자(.)를 사용해서 import a.b.c처럼 import할 때 가장 마지막 항목인 c는 반드시 모듈 또는 패키지여야만 한다.

_init.py의 용도

__init__.py파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다. 만약 game, sound, graphic 등 패키지에 포함된 디렉터리에 이 파일이 없다면 패키지로 인식되지 않는다.
python3.3 버전부터는 이 파일이 없어도 패키지로 인식한다(PEP 420) 하지만 하위 버전 호환을 위해 이 파일을 항상 생성하는 것이 안전한 방법이다.

  • from의 마지막 항목인 c가 모듈인 경우
from game.sound.echo import *
echo.echo_test()
echo
  • 모듈이 아닌 경우

오류가 발생한다. 이렇게 특정 디렉터리의 모듈을 를 사용해 import 하려면 해당 디렉터리의 __init__.py 파일에 __all__변수를 설정하고 import할 수 있는 모듈을 정의해 주어야한다.


여기에서 __all__이 의미하는 것은 sound 디렉터리에서
기호를 사용해 import할 경우 이곳에 정의된 echo 모듈만 import된다는 의미이다. 위의 from의 마지막 항목이 모듈인 경우는 __all__과 상관없이 무조건 import 된다.

  • 해당 디렉터리의 __init__.py파일에 __all__변수를 설정할 경우

오류가 나지 않는다.

relative 패키지

  1. 만약 다른 디렉터리(graphic)의 모듈(render.py)이 sound 디렉터리의 echo.py 모듈을 사용하고 싶다면 다음과 같이 render.py를 수정하면 가능하다.
    from game.sound.echo import echo_test문장을 추가해 이제 echo_test함수를 사용할 수 있다.
from game.graphic.render import render_test
render_test()
>>render
>>echo
  1. 위처럼 from game.sound.echo import echo_test를 입력해 전체 경로를 사용하여 import할 수도 있지만 다음과 같이 relative하게 import 하는 것도 가능하다.
    여기에서 ..은 부모 디렉터리를 의미한다. graphic과 sound 디렉터리는 동일한 깊이(depth)이므로 부모 디렉터리(..)를 사용해 import가 가능하다.
  • .. - 부모 디렉터리 : render.py처럼 모듈 안에서 사용해야한다.
  • . - 현재 디렉터리
profile
https://gggggeun.tistory.com/

0개의 댓글