Python 패키지

배추·2025년 11월 23일

🐍 Python

목록 보기
15/19

Python의 패키지 대해 알아봅니다.


▶︎패키지

  • 패키지(packages): 관련 있는 모듈의 집합.
    • 파이썬에서 모듈은 하나의 .py 파일이다.
  • 파이썬 패키지는 디렉터리와 파이썬 모듈로 이루어진다.
    • 패키지는 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해 준다.
  • 장점
    • 패키지 구조로 파이썬 프로그램을 만드는 것이 공동 작업이나 유지 보수 등 여러 면에서 유리하다.
    • 패키지 구조로 모듈을 만들면 다른 모듈과 이름이 겹치더라도 더 안전하게 사용할 수 있다.
  • 예) game 패키지
    • 확장자가 .py인 파일은 파이썬 모듈.
    • game 디렉터리가 이 패키지의 루트 디렉터리.
    • sound, graphic, play는 서브 디렉터리.
      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. C:/doit 디렉터리 밑에 game 및 기타 서브 디렉터리를 생성하고 .py 파일들을 다음과 같이 만든다.
  • 각 디렉터리에 init.py 파일을 만들어 놓기만 하고 내용은 일단 비워 둔다.
C:/doit/game/__init__.py
C:/doit/game/sound/__init__.py
C:/doit/game/sound/echo.py
C:/doit/game/graphic/__init__.py
C:/doit/game/graphic/render.py
  1. echo.py 파일의 내용 작성.
# echo.py
def echo_test():
    print("echo")
  1. render.py 파일의 내용 작성.
# render.py
def render_test():
    print("render")
  1. game 패키지를 참조할 수 있도록 명령 프롬프트 창에서 set 명령어로 PYTHONPATH 환경 변수에 C:/doit 디렉터리를 추가하고 실행.
C:\> set PYTHONPATH=C:/doit
C:\> python

▶︎패키지 안의 함수 실행하기

1. 모듈을 import하여 실행

import game.sound.echo

game.sound.echo.echo_test() # echo

2. 모듈이 있는 디렉터리까지를 import하여 실행

from game.sound import echo

echo.echo_test() # echo

3. 모듈의 함수를 직접 import하여 실행

from game.sound.echo import echo_test

echo_test() # echo

패키지를 바로 import

import game

game.sound.echo.echo_test() # 오류
  • import game을 수행하면 game 디렉터리의 __init__.py에 정의된 것만 참조할 수 있다.

함수를 바로 import는 불가

import game.sound.echo.echo_test

# 오류
  • 도트 연산자(.)를 사용해서 import a.b.c처럼 import할 때 가장 마지막 항목인 c는 반드시 모듈 또는 패키지여야만 한다.

▶︎__init__.py 파일

해당 디렉터리가 패키지의 일부임을 알려준다.

  • 만약 game, sound, graphic 등 패키지에 포함된 디렉터리에 __init__.py 파일이 없다면 패키지로 인식되지 않는다.
  • python 3.3 버전부터는 __init.py 파일이 없어도 패키지로 인식한다(PEP 420). 하지만 하위 버전 호환을 위해 __init.py 파일을 생성하는 것이 안전한 방법이다.

패키지와 관련된 설정이나 초기화 코드를 포함할 수 있다.

패키지 변수 및 함수 정의

  • 패키지 수준에서 변수와 함수를 정의할 수 있다.
# C:/doit/game/__init__.py

# game 패키지의 \__init__.py 파일에 공통 변수나 함수를 정의.
VERSION = 3.5

def print_version_info():
    print(f"The version of this game is {VERSION}.")
  • 패키지의 __init__.py 파일에 정의된 변수와 함수의 사용.
import game

print(game.VERSION) # 3.5
game.print_version_info() # The version of this game is 3.5.

패키지 내 모듈을 미리 import

  • __init__.py 파일에 패키지 내의 다른 모듈을 미리 import하여 패키지를 사용하는 코드에서 간편하게 접근할 수 있게 한다.
# C:/doit/game/__init__.py

# 패키지 내의 다른 모듈을 미리 import
from .graphic.render import render_test

VERSION = 3.5

def print_version_info():
    print(f"The version of this game is {VERSION}.")
# 패키지를 사용하는 코드에서는 간편하게 game 패키지를 통해 render_test 함수를 사용할 수 있다.

import game

game.render_test() # render

패키지 초기화

  • __init__.py 파일에 패키지를 처음 불러올 때 실행되어야 하는 코드를 작성할 수 있다.
    • 데이터베이스 연결이나 설정 파일 로드와 같은 작업을 수행할 수 있다.
  • 패키지의 초기화 코드는 하위 모듈의 함수를 import할 경우에도 실행된다.
  • 단, 초기화 코드는 한 번 실행된 후에는 다시 import를 수행하더라도 실행되지 않는다.
# C:/doit/game/__init__.py
from .graphic.render import render_test

VERSION = 3.5

def print_version_info():
    print(f"The version of this game is {VERSION}.")

# 여기에 패키지 초기화 코드를 작성한다.
print("Initializing game ...")
# 패키지를 처음 import할 때 초기화 코드가 실행된다.

import game
# Initializing game ...
# game 패키지의 초기화 코드는 game 패키지의 하위 모듈의 함수를 import할 경우에도 실행된다.

from game.graphic.render import render_test
# Initializing game ...
# game 패키지를 import한 후에 하위 모듈을 다시 import 하더라도 초기화 코드는 처음 한 번만 실행된다.

import game
# Initializing game ...

from game.graphic.render import render_test
# 초기화 코드 실행 안됨

__all__

from game.sound import *
# Initializing game ...

echo.echo_test() # echo라는 이름이 정의되지 않았다는 오류 발생.
  • 특정 디렉터리의 모듈을 *를 사용하여 import할 때는 해당 디렉터리의 __init__.py 파일에 __all__ 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 한다.
# C:/doit/game/sound/__init__.py

__all__ = ['echo']
# sound 디렉터리에서 *를 사용하여 import할 경우, 이곳에 정의된 echo 모듈만 import된다는 의미.
from game.sound import *
# Initializing game ...

echo.echo_test() #echo
  • from game.sound.echo import *은 __all__과 상관없이 import된다. 이렇게 __all__과 상관없이 무조건 import되는 경우는 from a.b.c import *에서 from의 마지막 항목인 c가 모듈인 때이다.

▶︎상대경로 패키지

  • graphic 디렉터리의 render.py 모듈에서 sound 디렉터리의 echo.py 모듈을 사용하고 싶다면 render.py를 수정하면 가능하다.
# render.py

from game.sound.echo import echo_test # 전체 경로를 사용하여 import
from ..sound.echo import echo_test # 상대경로로 import하는 것도 가능

def render_test():
    print("render")
    echo_test()
from game.graphic.render import render_test
# Initializing game ...

render_test()
# render
# echo
profile
난 🥬

0개의 댓글