03 패키지
- 패키지(Packages)는 도트(.)를 사용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해준다.
- 패키지 구조로 프로그램을 만들면 공동작업이나 유지 보수에 유리하다.
- 패키지 구조로 모듈을 만들면 다른 모듈과 이름이 겹치더라도 안전하게 사용할 수 있다.
예시를 보자.
gmae/
__init__.py
sound/
__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 디렉터리는 서브 디렉터리이다.
03-1 패키지 만들기
위 구조에서처럼 game 패키지를 만들어보자.
우선 루트 디렉터리인 game, 서브 디렉터리인 sound, graphic을 만들고 각 디렉터리에 __init__.py파일을 넣었다.
#echo.py
def echo_test():
print("echo")
#render.py
def render_test():
print("render")
그리고 echo.py와 render.py파일을 위와 같이 각각 만들었다.
파일 내의 함수를 실행시켜 보자.
- game 패키지를 참조하기 위해 cmd에서 환경 변수 PYTHONPATH를 사용해서 game 디렉터리가 들어있는 ch05 디렉터리의 경로를 넣어주었다.
- 파이썬 대화형 인터프리터를 실행시키고 from game.sound import echo 명령어로 모듈을 불러왔다.
- echo.echo_test() 명령어(모듈명.함수명)를 사용해 함수를 실행시켰다.
*import 예제에서는 항상 다음 예제를 실행할 때 인터프리터를 종료하고 다시 실행해야 한다. 그렇지 않으면 메모리에 이전에 import한 것이 남아 있어 잘못된 결과가 나올 수 있다(윈도우의 경우 종료는 exit()또는 Ctrl+Z)
03-2 __init__.py의 용도
- __init__.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다.
- 만약 game, sound, graphic에 이 파일이 없다면 패키지로 인식되지 않는다.
*python3.3부터는 __init__.py파일이 없어도 패키지로 인식하지만 하위 버전 호환을 위해 파일을 생성하는 것이 안전하다.
03-3 relative 패키지
graphic 디렉터리의 render.py 모듈에서 sound 디렉터리의 echo.py 모듈을 사용하는 법을 알아보자.
#render.py
from game.sound.echo import echo_test
def render_test():
print("render")
echo_test()
우선 render.py를 위와 같이 수정했다.
대화형 인터프리터에서 파일을 실행하니 이상없이 echo_test() 함수가 사용되었다.
#render.py
from ..sound.echo import echo_test
def render_test():
print("render")
echo_test()
- render.py의 echo_test() 함수는 위와 같이 relative하게 import할 수도 있다.
- 위 코드에서 ..은 부모 디렉터리를 의미한다.
- graphic과 sound가 동일한 깊이(depth)이므로 부모 디렉터리(..)를 사용한 import가 가능하다.
*..과 같은 relative한 접근자는 모듈 안에서만 사용해야 한다. 파이썬 인터프리터에서 사용하면 에러가 발생한다.
이 글은 책 『Do it! 점프 투 파이썬』을 읽은 후 작성한 글입니다.
'Programming > Python' 카테고리의 다른 글
Do it! 공부단 7일차 | ch05 파이썬 날개달기_내장 함수 (0) | 2021.03.23 |
---|---|
Do it! 공부단 7일차 | ch05 파이썬 날개달기_예외 처리 (0) | 2021.03.23 |
Do it! 공부단 6일차 | ch05 파이썬 날개달기_모듈 (0) | 2021.03.22 |
Do it! 공부단 5일차 | ch05 파이썬 날개달기_클래스 (0) | 2021.03.18 |
Do it! 공부단 4일차 | ch04 프로그램의 입력과 출력_사용자 입출력과 파일 (0) | 2021.03.10 |