예전에는 파이썬 패키지를 만들 때 setup.py
, requirements.txt
, MANIFEST.in
등 여러 파일을 관리해야 했고, 의존성 관리도 pip
와 virtualenv
로 수동 처리하곤 했습니다. PEP 518로 제안된 pyproject.toml
은 프로젝트 빌드 시스템 표준을 정의하고, Poetry 같은 툴을 이용하면 의존성 관리, 빌드, 배포까지 한 번에 해결할 수 있습니다.
이번 글에서는 기존 방식과 새 방식의 비교, pyproject.toml과 Poetry의 장단점, 기본 사용법을 다룹니다.
이전에는 어떻게 했을까?
setup.py + requirements.txt 방식
setup.py
로 패키지 메타데이터(이름, 버전, 의존성) 정의requirements.txt
로 개발 의존성 관리- 패키지 빌드/배포 시
python setup.py sdist bdist_wheel
등 명령 실행 - 의존성 추가/삭제 시 requirements.txt 수정 후
pip install -r requirements.txt
재실행
단점:
- 여러 파일 관리 필요
- 표준화된 빌드/런타임 환경 정의 어려움
- 의존성 충돌 시 해결 과정 번거로움
pyproject.toml 표준과 Poetry 소개
pyproject.toml
는 PEP 518에 정의된 표준 빌드 설정 파일로, 빌드 도구(예: Poetry, Flit, setuptools) 설정을 담을 수 있습니다. Poetry는 이 파일을 기반으로 의존성 정리, 패키지 빌드, 퍼블리시를 체계적으로 처리합니다.
Poetry 장점
- 모든 설정 centralization: pyproject.toml 하나로 의존성, 메타데이터, 스크립트 정의 가능
- 의존성 관리 자동화:
poetry add package_name
으로 의존성 추가,poetry.lock
로 재현성 있는 빌드 - 가상환경 자동 관리:
poetry install
시 자동으로 venv 생성, 의존성 설치 - 빌드/배포 단순화:
poetry build
,poetry publish
로 손쉽게 패키지화
단점:
- Python 3.7+ 등 비교적 최신 환경 필요(실제는 Python 3.7 이하에서도 동작 가능하지만 권장버전은 최신)
- 기존
setup.py
기반 워크플로우에서 전환 시 초기 학습 필요 - Poetry 외에도 Flit, Hatch 등 다양한 빌드도구 존재 → 도구 선택 고민 가능
간단한 예제
프로젝트 디렉토리에서 Poetry 초기화:
pip install poetry
poetry init
질문에 답하면 pyproject.toml
생성. 이후 의존성 추가:
poetry add requests
pyproject.toml
에는 다음과 같이 의존성이 기록됨:
[tool.poetry.dependencies]
python = "^3.9"
requests = "^2.26.0"
poetry install
명령으로 모든 의존성 설치, poetry shell
로 가상환경 활성화. 이로써 설치, 가상환경, 의존성 정리가 자동화됨.
기존 방식 대비 장단점 정리
장점:
- 중앙 집중식 설정: 하나의 파일(pyproject.toml)에 프로젝트 정보, 빌드/런타임 의존성 모두 명시
- 재현성:
poetry.lock
로 특정 의존성 버전 고정, 누구나 동일한 환경 재현 - 명령어 직관성:
poetry add
,poetry remove
,poetry build
등 명령어로 작업 간소화
단점:
- 전환 비용: 기존 프로젝트를 Poetry로 전환 시 pyproject.toml 작성, 기존 요구사항 변환 필요
- 학습 필요: Poetry CLI 사용법, pyproject.toml 문법 숙지 필요
대부분의 현대 파이썬 프로젝트는 pyproject.toml 기반 환경을 채택하는 추세이며, Poetry는 의존성 관리와 패키지화에서 큰 편의를 제공한다는 점에서 점점 더 인기가 많아지고 있습니다.
결론
- 기존
setup.py
,requirements.txt
등 분산된 설정에서 벗어나 pyproject.toml + Poetry를 도입하면, 패키징과 의존성 관리를 표준화하고 자동화할 수 있음 - 명확한 버전 고정, 쉽게 의존성 추가/삭제, 재현성 높은 환경 구성 등 현대적 파이썬 프로젝트 관리에 유리
- 점진적 전환 가능: 기존 프로젝트도 천천히 Poetry로 이동 가능
다음 글에서는 Python 3.10 이상의 패턴 매칭(Pattern Matching) 기능을 통해 복잡한 조건문을 현대적으로 단순화하는 방법을 다루겠습니다.
'개발 이야기 > Python (파이썬)' 카테고리의 다른 글
[모던 Python 8편] Context Manager와 with문으로 자원 자동 정리하기 (0) | 2024.12.17 |
---|---|
[모던 Python 7편] 패턴 매칭(Pattern Matching)으로 조건문 단순화하기 (0) | 2024.12.17 |
[모던 Python 5편] concurrent.futures, asyncio로 동시성/병렬 코드 간소화하기 (0) | 2024.12.17 |
[모던 Python 4편] pathlib로 직관적인 파일 경로 처리하기 (1) | 2024.12.17 |
[모던 Python 3편] dataclass로 데이터 구조 간소화하기 (0) | 2024.12.17 |