Wisdom’s Cloud

[PYTHON] 9. 패키지 본문

PYTHON

[PYTHON] 9. 패키지

지혜로운지혜쓰 2021. 2. 24. 17:17
패키지
  • 패키지(Packages)는 '.'을 사용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해준다.

  • 예를 들어 모듈 이름이 A.B인 경우에 A는 패키지 이름이 되고, B는 A 패키지의 B 모듈이 된다.

  • 간단한 파이썬 프로그램이 아니라면 이렇게 패키지 구조로 파이썬 프로그램을 만드는 것이 공동 작업이나 유지 보수 등 여러 면에서 유리하다.

  • 또한 패키지 구조로 모듈을 만들면 다른 모듈과 이름이 겹치더라도 더 안전하게 사용할 수 있다.

 

 

  • 패키지 만들기

# C:/doit 디렉터리 밑에 game 및 기타 서브 디렉터리를 생성하고 .py 파일들을 다음과 같이 만들어 보자.
# 각 디렉터리에 __init__.py 파일의 내용은 일단 비워 둔다.
C:/doit/game/__init__.py
C:/doit/game/sound/__init__.py
C:/doit/game/sound/echo.py
C:/doit/game/graphic/__init__.py
C:/doit/game/graphic/render.py
# echo.py 파일은 다음과 같이 만든다.
def echo_test():
   print("echo")
# render.py 파일은 다음과 같이 만든다.
def render_test()
   print("render")

만든 game 패키지를 참조할 수 있도록 명령 프롬프트창에서 set 명령어로 PYTHONPATH 환경 변수에 C:/doit 디렉터리를 추가하고, 파이썬 인터프리터를 실행한다.
echo 모듈을 import하여 실행하는 방법이다.
echo 모듈이 있는 디렉터리까지를 from ... import하여 실행하는 방법이다.
echo 모듈의 echo_test 함수를 직접 import하여 실행하는 방법이다.
import game을 수행하면 game 디렉터리의 모듈 또는 game 디렉터리의 __init__.py에 정의한 것만 참조할 수 있기 때문에 다음과 같이 echo_test 함수를 사용하는 것은 불가능하다.
'.'을 사용해서 import a.b.c처럼 import할 때 가장 마지막에 오는 항목인 c는 반드시 모듈 또는 패키지여야만 하기 때문에 다음처럼 echo_test 함수를 사용하는 것도 불가능하다.

 

  • __init__.py의 용도

# C:/doit/game/sound/__init__.py
__all__ = ['echo']
# __init__.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다.
# 만약 game, sound, graphic 등 패키지에 포함된 디렉터리에 __init__.py 파일이 없다면 패키지로 인식되지 않는다.
# 특정 디렉터리의 모듈을 '*'을 사용하여 import할 때에는 다음과 같이 해당 디렉터리의 __init__.py 파일에
# __all__ 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 한다.
# 여기서 __all__이 의미하는 것은 sound 디렉터리에서 * 기호를 사용하여 import할 경우
# 이곳에 정의된 echo 모듈만 import된다는 의미다.

 

  • relative 패키지

# graphic 디렉터리의 render.py 모듈이 sound 디렉터리의 echo.py 모듈을 사용하고 싶다면
# 다음과 같이 render.py를 수정하면 가능하다.
from game.sound.echo import echo_test
def render_test():
   print("render")
   echo_test()

# 위 예제처럼 전체 경로를 사용하여 import할 수도 있지만 다음과 같이 relative하게 import하는 것도 가능하다.
from ..sound.echo import echo_test
def render_test():
   print("render")
   echo_test()
# graphic과 sound 디렉터리는 동일한 깊이이므로 부모 디렉터리(..)를 사용하여 위와 같은 import가 가능하다.
# ..과 같은 relative한 접근자는 render.py처럼 모듈 안에서만 사용해야 하며,
# 파이썬 인터프리터에서 relative한 접근자를 사용하면 오류가 발생한다.

'PYTHON' 카테고리의 다른 글

[PYTHON] 11. 내장 함수  (0) 2021.02.25
[PYTHON] 10. 예외 처리  (0) 2021.02.24
[PYTHON] 8. 모듈  (0) 2021.02.24
[PYTHON] 7. 클래스  (0) 2021.02.24
[PYTHON] 6. 파일 읽고 쓰기  (0) 2021.02.16