패키지는 모듈들을 모아놓은 디렉토리 또는 그 디렉토리들은 모아놓은 상위 디렉토리 이다. 패키지는 많은 수의 모듈을 적절히 분류하여 계층적 구조로 만든 것으로 모듈을 효율적으로 관리할 수 있게 해준다.

image

.py 확장자의 모듈이 있고 모듈을 포함하는 sound, graphic, play 디렉토리가 있다. game 디렉토리가 패키지의 루트 디렉토리다.

패키지를 이용하면 프로그램의 구조를 한눈에 파악하기 쉽고 공동유지나 보수가 쉬워지는 장점이 있다.

 

 

1. 패키지 내부 함수 실행하기


C:/Python/game/init.py

C:/Python/game/sound/init.py

C:/Python/game/sound/echo.py

C:/Python/game/graphic/init.py

C:/Python/game/graphic/render.py

먼저 위와 같은 디렉토리 구조를 만들어서 테스트 해보려한다.

그리고 __init__.py 모듈들은 일단 비워두고 echo.py와 render.py 모듈 안에 다음의 함수를 작성한다.

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

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

이제 어떤 파이썬 파일에서 위의 디렉토리를 이용하려면 먼저 path 형성을 해주어야한다.
import sys
sys.path.append("C:/Python")

이제 import를 할 때 C:/Python 디렉토리가 인식이 될 것이다.

 

패키지의 함수를 실행하는 방법 3가지는 다음과 같다.

# 패키지 내부 함수 실행하기 1
# 모듈 까지 import
import game.graphic.render
import game.sound.echo
game.graphic.render.render_test()
game.sound.echo.echo_test()

 

# 패키지 내부 함수 실행하기 2
# 모듈이 있는 디렉토리까지 from 하고 모듈 import
from game.graphic import render
from game.sound import echo
render.render_test()
echo.echo_test()

 

# 패키지 내부 함수 실행하기 3
# 모듈 까지 from 하고 함수 import
from game.graphic.render import render_test
from game.sound.echo import echo_test
render_test()
echo_test()

 

 

 

2. __init__.py


__init__.py 모듈은 이 파일이 존재하는 디렉토리가 패키지의 일부임을 알려준다.

하지만 python 3.3 부터는 __init__.py가 없어도 패키지로 인식이 된다. 그러나 하위 버전 프로그램들과의 호환을 위해 __init__.py 모듈을 포함시켜 주는 것이 좋다.

 

 

 

3. __all__


앞서 import * 는 '모든 것을 가져와라' 정도로 해석이 된다고 했다.

#practice.py
import sys
sys.path.append("C:/Python")

from game.sound import *
echo.echo_test()

'NameError: name 'echo' is not defined' 와 같은 에러가 난다. echo 모듈이 정의되지 않았다는 것이다.

사실 import *을 했을 때 가져오는 것은 __init__.py 내부에 정의된 모듈들이다. 하지만 지금은 sound 디렉토리 안의 __init__.py 파일에 아무것도 작성이 되어있지 않아 오류가 난 것이다.

# __init__.py

__all__ = ['echo']

sound 디렉토리의 __init__.py 에 위와 같이 코드를 작성하면 echo 모듈이 포함이 된다. 이후 다시 실행 시켜보면 오류가 나지않고 'echo'가 출력된다.

 

+ Recent posts