패키지 단위에서 __init__.py를 쉽게 볼 수 있다.

 

이에 대하여 설명해주겠다.

 

__init__.py는 해당 디렉토리에 없다면, 패키지의 일부라고 인지하지 못하므로 한 패키지 안에 있다면 꼭 만들어줘야한다. (python 3.3 이상의 버전에서는 __init__.py가 없어도 패키지의 일부로 인식한다. 하지만 하위 버전 호환을 고려해 __init__.py를 만들어주는 것이 당분간은 필요할 것으로 보인다.)

 

아래와 같이 세팅되어있는 환경으로 예를 들겠다. __init__.py는 모두 비어있는 채로 두겠다.

/game/__init__.py

/game/sound/__init__.py

/game/sound/echo.py

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

/game/graphic/__init__.py

/game/graphic/render.py

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

 

 

 

1. / 위치에서 echo.py 파일의 echo_test 함수 사용하기

import game.sound.echo.echo_test
game.sound.echo.echo_test()
# 출력값 : echo
from game.sound import echo.echo_test
echo.echo_test()
# 출력값 : echo
from game.sound.echo import echo_test
echo_test()
# 출력값 : echo

 - 하지만 아래처럼 사용시 오류가 발생한다.

import game
game.sound.echo.echo_test()
# AttributeError: 'module' object has no attribute 'sound'

위와 같이 game만을 import할 경우, game 디렉터리의 모듈들이나 game 디렉터리의 __init__.py에 정의한 것만 참조할 수 있기 때문이다.

 - 도트(.)연산자를 통해 import할 경우 마지막 항목이 모듈이나 패키지여야만 오류가 발생하지 않는다.

import game.sound.echo.echo_test
# AttributeError: 'module' object has no attribute 'sound'

 

 

 

2. import * 에 대하여

from game.sound import *
echo.echo_test()
# NameError: name 'echo' is not defined

import * 입력시 모든 모듈, 함수를 가져와 사용할 수 있는 것처럼 보이지만 그렇지 않다. 그렇게 하기 위해서는 __init__.py에 아래와 같은 설정값을 넣어줘야한다.

$ vim /game/sound/__init__.py

__all__ = ['echo']
# sound/ 위치에서 import * 입력시 echo 모듈을 참조하도록 설정하는 문구

위와 같이 설정 후 다시 실행해주면 정상적으로 참조해온다.

from game.sound import *
echo.echo_test()
# 출력값 : echo

 

 

 

3. /game/graphic/render.py 에서 echo.py의 echo_test 함수 사용하기

 

 - 전체 경로로 참조하기

# vim /game/graphic/render.py
from game.sound.echo import echo_test
def render_test():
    echo "render"
    echo_test()
from game.graphic.render import render_test
render_test()
# 출력값
# render
# echo

 

- 상대 경로로 참조하기

# vim /game/graphic/render.py
from ..sound.echo import echo_test
def render_test():
    echo "render"
    echo_test()
from game.graphic.render import render_test
render_test()
# 출력값
# render
# echo

 

 

+ Recent posts