파이썬/점프투파이썬

점프투파이썬 : 11일차(2)_패키지

TYRREN 2023. 1. 9. 17:10

05-3 패키지

 

패키지(Packages)란?

도트(.)를 사용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해준다.

예를 들어 모듈 이름이 A.B인 경우

A는 패키지 이름이 되고 B는 A 패키지의 B 모듈이 된다.

 

파이썬 패키지는 디렉터리와 파이썬 모듈로 이루어진다.

 

예시) game 패키지

game/

    __init__.py

    soud/

        __init__.py

        echo.py

        wav.py

    graphic/

        __init__.py

        screen.py

        render.py

    play/

        __init__.py

        run.py

        test.py

 

game, sound, graphic, play는 디렉터리이고 확장자가 .py인 파일은 파이썬 모듈이다.

game 디렉터리가 이 패키지의 루트 디렉터리이고 

sound, graphic, play는 서브 디렉터리이다.

 

간단한 파이썬 프로그램이 아니면

이렇게 패키지 구조로 파이썬 프로그램을 만드는 것이

공동 작업이나 유지 보수 등 여러 면에서 유리하다.

 


 

패키지 만들기

 

패키지 기본 구성 요소 준비하기

① c:\doit 디렉터리 밑에 game 및 기타 서브 디렉터리를 생성하고 .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

 

② 각 디렉터리에 __init__.py 파일을 만들어 놓기만 하고 내용은 일단 비워둔다.

③ echo.py 파일은 다음과 같이 만든다.

 

def echo_test() :
    print("echo")

 

④ render.py 파일은 다음과 같이 만든다.

 

def render_test():
    print("render")

 

⑤ 다음 예제를 수행하기 전에 우리가 만든 game 패키지를 참조할 수 있도록 명령 프롬프트 창에서 set 명령어로 PYTHONPATH 환경 변수에 c:/doit 디렉토리를 추가한다.

그리고 파이썬 인터프리터를 실행한다.

 

C:\Users\kimkt>cd c:\doit
c:\doit>set PYTHONPATH=c:\doit
c:\doit>python
Type "help", "copyright", "credits" or "license" for more information.

 


 

패키지 안의 함수 실행하기

 

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

 

첫 번째는 echo 모듈을 import하여 실행하는 방법이다.

 

>>> import game.sound.echo
>>> 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

 


 

__init__.py의 용도

 

__init__.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할이다.

만약 game, sound, graphic 등 패키지에 포함된 디렉터리에 __init__.py 파일이 없다면 패키지로 인식되지 않는다.

 


 

relative 패키지

 

만약 graphic 디렉토리의 render.py 모듈이 sound 디렉터리의 echo.py 모듈을 사용하고 싶다면 어떻게 해야 할까?

다음과 같이 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

 

가 수행됨을 확인할 수 있다.

 

위 예처럼 하는 방법도 있지만 

relative하게 import 하는 방법도 있다.

 

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

 

여기에서 ..은 render.py 파일의 부모 디렉터리를 말한다.

따라서 render.py 파일의 부모 디렉터리는 game이므로 위와 같은 import가 가능한 것이다.

 

relative한 접근자에는 다음과 같은 것이 있다.

.. : 부모 디렉터리

. : 현재 디렉터리