728x90
반응형
SMALL
패키지란 무엇인가?
패키지는 모듈을 디렉토리형식으로 구조화한 것
패키지(Packages)는 도트(.)를 사용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해준다
패키지 만들기
모듈들은 넣어둔 디렉토리명이 패키지명 ex) import game.sound.echo
패키지내 각 디렉토리에는 init.py 가 반드시 존재
init.py 파일은 비어있을수도 있고, 패키지내에 포함된 모듈들의 정보를 제공
game/
__init__.py
sound/
__init__.py
echo.py
wav.py
graphic/
__init__.py
screen.py
render.py
play/
__init__.py
run.py
test.py
패키지 안의 함수 실행하기
import game을 수행하면 game 디렉터리의 모듈 또는 game 디렉터리의 init.py에 정의한 것만 참조할 수 있다.
#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
#error 1
>>> import game
>>> game.sound.echo.echo_test()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'sound'
#error 2
>>> import game.sound.echo.echo_test
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named echo_test
init.py 의 용도
init.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할
game, sound, graphic 등 패키지에 포함된 디렉터리에 init.py 파일이 없다면 패키지로 인식되지 않는다.
특정 디렉터리의 모듈을 를 사용하여 import할 때에는 다음과 같이 해당 디렉터리의 *init.py 파일에 **all 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 한다.
/*
__all__이 의미하는 것은 sound 디렉터리에서 * 기호를 사용하여
import할 경우 이곳에 정의된 echo 모듈만 import된다는 의미
*/
# C:/doit/game/sound/__init__.py
__all__ = ['echo']
※ 착각하기 쉬운데 from game.sound.echo import * 는 all과 상관없이 무조건 import된다. 이렇게 all과 상관없이 무조건 import되는 경우는 from a.b.c import * 에서 from의 마지막 항목인 c가 모듈인 경우이다.
relative 패키지 : 현제 위치로부터 상대경로 같이 사용
..과 같은 relative한 접근자는 render.py처럼 모듈 안에서만 사용
# render.py
from game.sound.echo import echo_test
def render_test():
print ("render")
echo_test()
/* relative 하게 패키지 선언 */
# render.py
from ..sound.echo import echo_test
def render_test():
print ("render")
echo_test()
728x90
반응형
LIST
'Program > Python' 카테고리의 다른 글
Python 내장함수 (0) | 2020.09.09 |
---|---|
Python 예외처리 (0) | 2020.09.09 |
Python 모듈 (0) | 2020.09.08 |
Python 클래스 (0) | 2020.09.08 |
Python 파일 읽고 쓰기 (0) | 2020.09.08 |