본문 바로가기

Programing/Python

[Python 입문] 16. 파이썬 패키지

목차

  • 파이썬에서 패키지란?
  • 디렉토리 구성
  • 패키지 사용하기
  • __init__.py의 용도
  • relative 패키지

파이썬 패키지

1. 파이썬에서 패키지란?

 패키지(Packages)도트(.)를 사용해 파이썬의 모듈을 계층적(디렉토리 구조)으로 관리할 수 있게 해준다. 하나의 큰기능을 위해 여러 모듈들의 묶음을 패키지라고 생각하면 될 것 같다.

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

 

 

2. 디렉토리 구성

 먼저 간단하게 게임을 만든다는 가정을 하고, 패키지를 만들기위해 필요한 디렉토리를 아래와 같이 구성해 보자. (이 부분은 자신의 컴퓨터 환경(Windows, Mac OS, Linux 등)에 따라 다를 것이다.) 필자의 경우 파이참을 사용중이며 이곳에서는 아래처럼 Python Package를 선택 할 수 있는데, 말이 Python Package이지 그냥 디렉토리라고 생각하면 된다.

 이때 해당 디렉토리가 패키지로 판단되려면, 위와 같이 디렉토리내에 __init__.py 파일이 존재해야하기 때문에 각 디렉토리에 해당 파일이 자동으로 만들어 지는 것을 볼 수 있다. 위의 그림의 좌측과 같이 패키지 디렉토리를 구성 해보자.

 그리고 sounde와 graphic 디렉토리에 각각 echo.py와 render.py라는 파일 아래와 같은 내용으로 만든다. 

# echo.py
def echo_test():
    print("echo")

# render.py
def render_test():
    print("render")

 위에 설명한 것과 같은 구조로 만들면 sound graphic 패키지에 각각의 실행 모듈(echo.py / render.py)이 존재하게 되는 것이다.

 참고로 앞서 말한것과 같이 파이참에서 패키지를 만들면 '__init__.py'가 자동으로 생성되는데 이것이 사용 방법은 뒤에 배울 것이기 때문에 그냥 둔다. 참고로 파이썬 3.3 이전 버전에서는 파이썬 패키지 안에는 __init__.py가 무조건 있어야 했지만 파이썬 3.3이후로는 없어도 된다고 한다. 하지만 하위 버전과의 호환을 위해 __init__를 생성하는 것이 안전할 것 같다.

 

 

3. 패키지 사용하기

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

# echo 모듈을 import해서 실행
import game.sound.echo
print(game.sound.echo.echo_test())
echo


# echo 모듈이 있는 디렉토리까지 from ... import해서 실행
from game.sound import echo
echo.echo_test()
echo


# echo 모듈의 echo_test 함수를 직접 import해서 실행
from game.sound.echo import echo_test
echo_test()
echo

 

 

4. __init__.py의 용도

 __init__.py는 해당 디렉토리가 패키지의 일부라는 것을 알려주는 역할을 한다. 만약 패키지에 포함된 디렉토리에 이 파일이 없다면 패키지로 인식되지 않는다. 

from game.sound import*
echo.echo_test()

Traceback (most recent call last):
  File "/jump_to_python/05/05_03_Packages.py", line 11, in <module>
    echo.echo_test()
NameError: name 'echo' is not defined

 

 그리고 만약 game.sound 패키지에서 위와 같이 모든 것(*)을 import하면 echo 모듈을 사용하고자 하는 경우와 같이 특정 디렉토리의 모듈을 (*)을 사용해 import할 때는 아래와 같이 해당 디렉토리의 비어있던 __init__.py파일에 __all__과 같은 변수를 설정해서 import할 수 있는 모듈을 정의해 줘야 한다. (아래의 예시는 sound 디렉토리의 __init__.py 파일을 수정한 것이다.)

__all__ = ['echo']

 

 

5. relative 패키지

 만약 graphic 디렉토리의 render.py 모듈이 sound 디렉토리의 echo.py 모듈을 사용하고 싶다면?

 아래와 같이 render.py에 'from game.sound.echo import echo_test'라는 문장을 추가하면 사용이 가능하다.

# render.py
from game.sound.echo import echo_test
def render_test():
    print("render")
    echo_test()

 

 수정한 후 실행하면 이상 없이 잘 실행되는 것을 확인할 수 있다.

from game.graphic.render import render_test
render_test()

render
echo

 위와 같이 전체 경로를 사용해서 import할 수도 있지만 아래와 같이 relative하게 import하는 것도 가능하니 알아두면 좋을 것 같다.

# render.py
from ..sound.echo import echo_test
def render_test():
    print("render")
    echo_test()

 위 소스코드를 보면 경로 중 game이 없어지고 ..가 그 자리를 대신한다. 여기서 ..은 부모 디렉토리를 의미한다. graphic과 sound 디렉토리가 동일한 깊이기 때문에 부모 디렉토리(..)의 사용이 가능한 것이다.

     ..: 부모 디렉토리

     .: 현재 디렉토리

 

 

내용 출처: 책 '점프 투 파이썬'의 내용