IT흔적

[파이썬]3.패키지 - 생성, __init__.py, __all__, relative 본문

DO it! Python/05.파이썬 날개 달기

[파이썬]3.패키지 - 생성, __init__.py, __all__, relative

흔적남기는 개발자 2018. 12. 27. 13:58

Packages - 도트(.)를 이용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리

ex). 모듈명이 A.B인 경우 A는 패키지명, BA 패키지의 B 모듈


ex)가상게임

game/                       # 루트 디렉터리

    __init__.py

    sound/                  # 서브 디렉터리

        __init__.py 

        echo.py

        wav.py

    graphic/               # 서브 디렉터리

        __init__.py

        screen.py

        render.py

    play/                    # 서브 디렉터리

        __init__.py

        run.py

        test.py

(1) game, sound, graphic, play는 디렉터리명, (.py) 확장자를 가지는 파일은 파이썬 모듈이다

    game 디렉터리가 이 패키지의 루트 디렉터리,   

    sound, graphic, play서브 디렉터리


간단한 파이썬 프로그램이 아니리라면 패키지구조가 공동작업이나 유지 보수 등에서 유리

패기지 구조로 모듈을 만들면 다른 모듈과 이름이 겹치더라도 안전!!


패키지 만들기


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


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 패키지를 참조할 수 있도록 도스창에 입력

C:\>set PYTHONPATH=C:/Python # PYTHONPATH 환경변수에 C:/Python 디렉터리 추가

C:\> Python

>>>

 

6.패키지 안의 함수 실행하기

-실행 방법은 3가지 # 예제를 실행하고 다음예제를 실행할때는 반드시 인터프리터 종료!!

(1) echo 모듈을 import하여 실행

>>> import game.sound.echo

>>> game.sound.echo.echo_test()

echo

(2) echo 모듈이 있는 디렉터리 까지 from ~ import하여 실행

>>> from game.sound import echo

>>> echo.echo_test()

echo

(3) echo 모듈의 echo_test 함수를 직접 import하여 실행

>>> from game.sound.echo import echo_test

>>> echo_test()

echo

(4) 중요!! echo_test 함수를 사용하는 것을 불가능

>>> import game

>>> game.sound.echo.echo_test()

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

AttributeError: module 'game' has no attribute 'sound'

* import game을 수행하면 game 디렉터리의 모듈 or game 디렉터리의 __init__.py에 정의된 것만 참조 가능!!!!

 

__init__.py의 용도

:해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다. 만약 game, sound, graphic 등 패키지안에 __init__.py가 없으면 패키지로 인식x //3.3버전부터는 없어도 가능!!


 __all__의 용도

>>>FROM game.sound import*

>>>echo.echo_test()

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

NameError: name 'echo' is not defined

특정 디렉터리의 모듈을 *을 이용하여 import 할때에는 해당 디렉터리(C:/Python/game/sound/_init.py)파일에 __all__이라는 변수를 설정하고 import할수 있는 모듈을 정의해주어야 한다.


# C:/Python/game/sound/_init.py

__all__ = [‘echo’] // __all__이 의미하는 것은 sound 디렉터리에서 *기호를 이용하여 import할 경우 이곳에 정의된 echo모듈만 import된다는 의미

!주의! 

from game.sound.echo import * __all__과 상관없이 무조건 import된다.

ex) from a.b.c import *에서 from의 마지막 항목인 c가 모듈인 경우이다.  


relative 패키지

Q.graphic 디렉터리의 render.py 모듈이 sound 디렉터리의 echo,py 모듈을 사용하고 싶다 면 어떻게 해야할까?

# render.py

from game.sound.echo import echo_test

def render_test():

print(“render”)

echo.echo_test()

1.

>>> from game.graphic.render import render_test

>>> render_test()

render

echo

2.

#render.py

from ..sound.echo import echo_test

 

def render_test():

print(“render”)

echo.echo_test() // 

.. 부모디렉터리

.  현재디렉터리