점프 투 파이썬 참고: https://wikidocs.net/1418
🔸 패키지: 모듈 여러 개 모아 놓은 것
패키지는 도트(.)를 사용하여 파이썬 모듈을 디렉터리 구조로 관리할 수 있게 해준다.
A.B
⬅️ 도트(.) 사용
A
: 패키지 이름
B
: A 패키지의 B모듈
🔷 패키지 기본 구성 요소 준비하기
루트 디렉터리 및 서브 디렉터리 생성하고 .py 파일들을 만든다.
🔷 각 디렉터리에 __init__.py
파일을 만들어 놓는다.
🔷 .py 파일에 함수 입력
패키지를 사용하여 echo.py 파일의 echo_test 함수를 실행하는 방법
패키지 안의 함수를 실행하는 방법은 3가지가 있다.
🔷 echo 모듈을 import하여 실행
import game.sound.echo ⬅️ game 안에 sound 안에 echo
game.sound.echo.echo_test()
👉 echo
🔷 echo 모듈이 있는 디렉터리까지를 from ... import하여 실행
from game.sound import echo ⬅️ game 안에 sound 안에 echo라는 모듈만
echo.echo_test()
👉 echo
🔷 echo 모듈의 echo_test 함수를 직접 import하여 실행
from game.sound.echo import echo_test ⬅️ echo_test라는 함수만
echo_test()
👉 echo
불러온 함수 이름 바꿔서 쓸 수 있음
from game.sound.echo import echo_test as e ⬅️ 이름 바꿔서 쓰겠다
e()
👉 echo
import a.b.c
처럼 도트 연산자(.)를 사용해서 import할 때는
가장 마지막 항목인 c는 반드시 모듈 또는 패키지여야만 한다.
__init__
.py 의 용도패키지 관련 설정하는 곳
__init__.py
파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다.
패키지에 포함된 디렉터리에 __init__.py
파일이 없다면 패키지로 인식되지 않는다.
📕
python3.3 버전부터는 __init__.py 파일이 없어도 패키지도 인식하지만
하위 버전 호환을 위해 __init__.py 파일을 생성하는 것이 안전하다.
특정 디렉터리의 모듈을 *
를 사용하여 import할 때에는 다음과 같이 해당 디렉터리의 __init__.py
파일에 아래와 같이 입력한다.
__all__ = ['echo'] 👈 해당 디렉터리의 __init__.py 파일에 입력
__all__ = ['echo', 'echo2', 'echo3'] 👈 [] 안에 계속 추가 가능
__all__
변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 한다.
위와 같이 __init__.py
파일을 변경한 뒤 실행하면 원하던 결과가 출력되는 것을 확인할 수 있다.
from game.sound.echo import *
echo_test()
👉 echo
from a.b.c import *
에서 from의 마지막 항목인 c가 모듈인 경우,
__all__
과 상관없이 무조건 import된다.
from game.sound.echo import *
는 __all__
과 상관없이 무조건 import된다.
game > graphic > render.py
sound > echo.py
만약 graphic 디렉터리의 render.py 모듈이 sound 디렉터리의 echo.py 모듈을 사용하고 싶다면 render.py를 수정하면 가능하다.
# render.py
from game.sound.echo import echo_test ⬅️ 추가
def render_test():
print("render")
echo_test()
from game.graphic.render import render_test
render_test()
👉
render
echo
다음과 같이 relative하게 import하는 것도 가능하다.
# render.py
from ..sound.echo import echo_test ⬅️ .. : 상위 폴더로 이동
def render_test():
print("render")
echo_test()
graphic과 sound 디렉터리는 동일한 깊이(depth)이므로
부모 디렉터리(..)를 사용하여 위와 같은 import가 가능하다.
📕 relative한 접근자
..
– 부모 디렉터리
.
– 현재 디렉터리
relative한 접근자는 모듈(파일) 안에서만 사용해야 한다.