[Do it! 점프 투 파이썬-스터디 노트] 05장 파이썬 날개 달기(05-3 패키지)

2021. 4. 18. 09:52PYTHON/Do it! 점프 투 파이썬

 

 

05장 파이썬 날개 달기

 

 

 

05-3 패키지

 

패키지란 무엇인가?

패키지(Packages)는 도트(.)를 사용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해준다. 모듈이름이 A.B인 경우에 A는 패키지 이름이 되고 B는 A패키지의 B모듈이 된다.

 

 

패키지 만들기

 

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

1. 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

 

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

 

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

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

 

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

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

 

5. 다음 예제를 수행하기 전에 우리가 만든 game 패키지를 참조할 수 있도록 명령 프롬프트 창에서 set 명령어로 PYTHONPATH  환경 변수에 C:\doit 디렉터리를 추가한다. 그리고 파이썬 인터프리터(Interactive shell)를 실행한다.

 

 

 

 

 

패키지 안의 함수 실행하기

import 예제는 하나의 예제를 실행하고 나서 다음 예제를 실행하기 전에 반드시 인터프리터를 종료하고 다시 실행해야 한다. 인터프리터를 다시 시작하지 않을 경우 이전에 import 한 것들이 메모에 남아있어 다른 결과가 나올 수 있다.

(윈도우 인터프리터 종료: Ctrl+Z)

 

①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

 

 

import game을 수행하면 game 디렉터리의 모듈 또는 game 디렉터리의 __init__.py에 정의한 것만 참조할 수 있기 때문에 오류가 발생한다.

import game
game.sound.echo.echo_test()

도트 연산자(.)를 사용해서 import a.b.c 처럼 import할 때 가장 마지막 항목인 c는 반드시 모듈 또는 패키지여야하기 때문에 아래의 경우 오류가 발생한다.

import game.sound.echo.echo_test

 

 

 

 

 

__init__.py 의 용도

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

 

특정 디렉터리의 모듈을 *를 사용하여 import 할 때는 해당 디렉터리의 __init__.py 파일에 __all__변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 한다.

#C:/doit/game/sound/__init__.py
__all__=['echo']

__all__은 sound 디렉터리에서 * 기호를 사용하여 import 할 경우 이곳에 정의된 echo 모듈만 import된다는 의미이다.

 

from game.sound.echo import * 는 __all__과 상관없이 무조건 import 된다. from a.b.c import * 에서 from의 마지막 항목인 c가 모듈인 경우이기 때문이다.

 

 

 

 

relative 패키지

graphic 디렉터리의 render.py 모듈이 sound 디렉터리의 echo.py 모듈을 사용하고 싶을 때

 

①전체경로 사용: from game.soun.echo import echo_test 문장을 추가하여 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

 

②relative 접근자 사용

#render.py
from ..sound.echo import echo_test

def render_test():
	print("render")
    echo_test()

.. 은 부모 디렉터리를 의미한다.

graphic과 sound 디렉터리는 동일한 깊이(depth)이므로 부모 디렉터리(..)를 사용하여 위와 같은 import가 가능하다.

..과 같은 relative 한 접근자는 render.py처럼 모듈 안에서만 사용해야 한다. 파이썬 인터프리터에서 relative한 접근자를 사용하면 오류가 발생한다.