패키지 단위에서 __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
'Development > Python' 카테고리의 다른 글
[Solved][Python] io.UnsupportedOperation: not writable (0) | 2019.12.02 |
---|---|
[Python] 업무자동화 실습 : raw data 필요시 iso -> utf8 인코딩 & 데이터 가공하여 DB에 넣는 프로그램 개발 (0) | 2019.12.01 |
[Python][Class] Class에서의 __init__은 무슨 의미일까? (0) | 2019.11.30 |
[Python][Module] if __name__ == "__main__" 은 무슨 의미일까? (0) | 2019.11.30 |
[Python] 업무자동화 실습 : 강남구 애견미용샵 txt Data 가공하여 DB에 넣기 (0) | 2019.11.27 |