Program/Python

Python 패키지

하랑파파♡ 2020. 9. 9. 10:41
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()

참고 : https://wikidocs.net/1418

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