[Python] 패키지(Packages)

Jeongyun Heo·2020년 12월 19일
0

Python

목록 보기
12/36

점프 투 파이썬 참고: 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된다.


✍️  relative 패키지

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한 접근자는 모듈(파일) 안에서만 사용해야 한다.

0개의 댓글