Python - 10. 모듈과 패키지

2025. 1. 19. 22:06프로그래밍 언어/Python

Python에서 모듈과 패키지는 코드의 재사용성을 높이고, 관리와 유지보수를 용이하게 하기 위한 필수적인 구성 요소입니다. 이번 섹션에서는 모듈과 패키지의 정의 및 사용법, 가상환경과 패키지 관리 방법을 다룹니다.


10.1 모듈의 정의와 사용

모듈이란?

모듈(Module)은 Python 코드가 저장된 파일로, 함수, 클래스, 변수 등을 정의하거나 실행 코드를 포함할 수 있습니다. 모듈은 .py 확장자로 저장됩니다.

모듈 생성과 사용

  • 모듈 생성
    • mymodule.py 파일을 생성합니다.
# mymodule.py

def greet(name):
    return f"Hello, {name}!"

PI = 3.14159

if __name__ == "__main__":
    print(greet("Test"))  # 모듈이 독립적으로 실행될 때만 실행됩니다.
  • 모듈 가져오기
    • import 키워드를 사용해 모듈을 가져옵니다.
import mymodule

print(mymodule.greet("Alice"))  # Hello, Alice!
print(mymodule.PI)  # 3.14159
  • 모듈 검색 경로
    • Python은 모듈을 sys.path에 정의된 경로에서 검색합니다.
import sys
print(sys.path)  # 모듈 검색 경로 출력
  • 순환 임포트 문제
    • 두 모듈이 서로를 임포트할 때 발생하는 문제입니다. 해결 방법으로는 모듈의 구조를 재설계하거나 import 문을 함수 내부에 배치합니다.
# 모듈 A
# from module_b import func  # 순환 임포트 발생

def func_a():
    from module_b import func
    func()

10.2 패키지 구조와 __init__.py

패키지란?

패키지(Package)는 여러 모듈을 디렉터리 구조로 묶어 관리하는 단위입니다. 패키지는 디렉터리 내부에 __init__.py 파일을 포함하여 Python 패키지로 인식됩니다.

패키지 구조 예제

myproject/
    mypackage/
        __init__.py
        module1.py
        module2.py
  • __init__.py: 패키지 초기화 파일로, 패키지를 초기화하거나 서브모듈을 설정하는 데 사용됩니다.

상대 임포트 vs 절대 임포트

  • 절대 임포트: 프로젝트의 루트 경로에서 시작하는 전체 경로를 사용합니다.
from mypackage.module1 import func1
  • 상대 임포트: 현재 위치를 기준으로 상대적인 경로를 사용합니다. .은 현재 디렉터리, ..은 상위 디렉터리를 나타냅니다.
from .module1 import func1

네임스페이스 패키지

Python 3.3 이상에서는 __init__.py 없이도 패키지를 만들 수 있습니다. 이를 네임스페이스 패키지라고 합니다. 여러 디렉터리에 걸쳐 있는 패키지를 하나로 결합할 때 유용합니다.

setup.py 사용법

setup.py는 패키지를 배포할 때 사용됩니다.

from setuptools import setup, find_packages

setup(
    name="mypackage",
    version="0.1",
    packages=find_packages(),
    install_requires=[
        "requests",
        "numpy"
    ],
)

10.3 가상환경과 패키지 관리

가상환경이란?

가상환경(Virtual Environment)은 프로젝트별로 독립적인 Python 환경을 제공하여, 패키지 충돌을 방지하고 관리합니다.

가상환경 생성과 활성화

  • 가상환경 생성
python -m venv myenv
  • 가상환경 활성화
  •     Windows:
myenv\Scripts\activate
  •     macOS/Linux:
source myenv/bin/activate
  • 가상환경 비활성화
deactivate

현대적 도구 소개

  • pipenv
    • 가상환경과 의존성 관리를 통합적으로 관리할 수 있는 도구입니다.
pip install pipenv
pipenv install requests
pipenv shell
  • poetry
    • 패키지 관리와 빌드 시스템을 제공하는 현대적인 도구입니다.
pip install poetry
poetry init
poetry add requests
poetry shell

의존성 관리 모범 사례

  • requirements.txt 사용
    • 프로젝트의 의존성을 명확히 기록합니다.
pip freeze > requirements.txt
pip install -r requirements.txt
  • 의존성 잠금
    • pipenv나 poetry를 사용하여 의존성 버전을 잠급니다.
  • 환경 분리
    • 개발, 테스트, 프로덕션 환경에서 서로 다른 의존성을 사용할 수 있도록 분리합니다.

가상환경 Best Practices

  • 각 프로젝트마다 가상환경을 생성합니다.
  • 의존성을 명확히 정의하고, 불필요한 패키지 설치를 피합니다.
  • requirements.txt나 poetry.lock 파일로 의존성을 관리합니다.

이번 섹션에서는 Python의 모듈과 패키지 사용법, 패키지 구조, 가상환경 및 패키지 관리 방법을 배웠습니다.