패키지

✒️ 2025-05-19 10:24 내용 수정

Do it! 점프 투 파이썬(2017년 발행) 내용을 정리


관련 있는 모듈의 집합

dir/
	moduel.py
	dir2/
		module2.py

패키지 만들기

  1. 패키지 디렉터리를 만들고, 하위에 서브 디렉터리와 모듈 파일들을 만든다.
    • 각 디렉터리의 하위에 __init__.py 파일을 만든다.
    • __init__.py 파일의 내용은 비워둔다.
test/
	__init__.py
	testsub/
		__init.py
		greeting.py
	hello.py
  1. hello.pygreeting.py에 테스트할 내용을 작성한다.
# hello.py
def print_hello():
	print("hello")
# greeting.py
def print_greeting():
    print("welcome!")
  1. test 패키지를 참조할 수 있도록 작업할 명령 프롬프트에서 set PYTHONPATH=패키지경로를 추가하고, Python 인터프리터를 실행한다.

python_package 1.png

  1. 이제 명령 프롬프트에서 패키지 안의 모듈을 import로 불러와 모듈 내의 함수를 실행한다.
>>> import test.testsub.greeting
>>> test.testsub.greeting.print_greeting()
welcome!
  1. 이번엔 test/testsub 디렉터리를 from ... import로 가져와서 실행한다.
    • 이전에 사용한 import 때문에 오류가 생길 수 있어 인터프리터를 다시 시작한 후 진행한다.
>>> from test.testsub import greeting
>>> greeting.print_greeting()
welcome!

__init__.py

  1. 패키지 변수와 함수 정의
    • 패키지 수준의 변수와 함수를 정의할 수 있다.
    • test/__init__.py에서 test/testsub/greeting.py에 있는 함수를 미리 import하는 구문을 작성한다.
    • test 패키지 변수인 VERSION을 정의하고, 패키지 함수 print_version()을 정의한다.
    • .testsub.greeting으로 작성한 것은 현재 test/__init__.py파일의 위치를 기준으로 testsub/greeting.py의 상대 경로를 작성한 것이다.
      • 상대 경로 작성 시 ..는 부모 디렉터리, .는 현재 디렉터리를 의미한다.
# test/__init__.py

from .testsub.greeting import print_greeting

VERSION = "3.13.2"

def print_version():
    print(f"Python version : {VERSION}")
>>> import test

>>> test.print_greeting()
welcome!

>>> test.VERSION
'3.13.2'

>>> test.print_version()
Python version : 3.13.2
  1. 패키지 초기화
    • 패키지를 처음 불러올 때 실행되어야 하는 코드를 작성할 수 있다.
    • 최상위 패키지에서 작성한 초기화 코드는 해당 패키지의 하위 모듈의 함수를 import할 때도 실행되지만, 초기화 코드는 한 번 실행된 후 다시 import할 때는 실행되지 않는다.
# test/__init__.py

from .testsub.greeting import print_greeting

VERSION = "3.13.2"

def print_version():
    print(f"Python version : {VERSION}")

# 패키지 초기화
print("Initializing test package")
>>> import test
Initializing test package

__all__ 변수

>>> from test.testsub.greeting import *
Initializing test package
>>> print_greeting()
welcome!
  1. 테스트를 위해 test/__init__.py에서 import를 제거한다.
# test/__init__.py

VERSION = "3.13.2"

def print_version():
    print(f"Python version : {VERSION}")

# 패키지 초기화
print("Initializing test package")
  1. 명령 프롬프트에서 Python 인터프리터를 실행하고, from ... import *를 사용하여 test/testsub 하위의 모듈을 모두 불러오도록 시도한다.
    • greeting이라는 모듈을 찾지 못해 에러가 생긴다.
>>> from test.testsub import *
Initializing test package
>>> greeting.print_greeting()
Traceback (most recent call last):
  File "<python-input-1>", line 1, in <module>
    greeting.print_greeting()
    ^^^^^^^^
NameError: name 'greeting' is not defined
  1. test/testsub/__init__.py 파일에서 __all__ 변수에 test/testsub/ 하위 모듈의 이름을 리스트로 정의한다.
# test/testsub/__init__.py

__all__ = ['greeting']
  1. 다시 Python 인터프리터에서 from ... import *를 수행하여 확인한다.
>>> from test.testsub import *
Initializing test package
>>> greeting.print_greeting()
welcome!