Python에서는 공식 의존성 관리자인 pip가 있으나 생각보다 번거롭고 의존성 관리에 불편함이 많다. 따라서 최근에는 Poetry를 도입하여 프로젝트의 의존성과 가상환경을 관리하고 있는데 이를 기록해두고자 한다.
Poetry는 pip와 유사한 Python 패키지 관리자로 Python 프로젝트의 의존성 관리와 패키지 빌드를 자동화하는 도구이다. pip는 패키지 관리(설치, 삭제, 의존성 관리)에 중점을 두고 있기에 가상환경 관리라던가 빌드 등은 별도로 신경 써야만 한다. 이에 반해 Poetry는 프로젝트의 가상환경과 의존성을 한번에 관리할 수 있으며 패키지 빌드와 배포를 자동화할 수 있다는 장점이 있다.
macOS에서는 Homebrew를 통해 간편하게 설치가 가능하고 Linux에서는 터미널에서 curl을 통해 간편하게 설치할 수 있다.
# macOS
brew install poetry
# Linux
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -
프로젝트를 생성하고 외부 라이브러리 설치하는 방법에 대해 알아보자.
신규 프로젝트를 만들기 위해서는 터미널에서 아래 명령어를 실행하면 된다.
poetry new {프로젝트명}
신규 프로젝트를 생성하면 아래와 같이 디렉토리가 구성되어 있다.
{신규 프로젝트명}
├── pyproject.toml
├── README.rst
├── {프로젝트명}
│ └── __init__.py
└── tests
├── __init__.py
직관적이기에 추가로 설명할 것도 없지만 굳이 간략하게 설명하자면,
pyproject.toml은 Poetry의 프로젝트 파일로, Python 프로젝트의 의존성을 관리하고 메타데이터와 빌드 시스템을 정의한다.
README.rst은 프로젝트의 설명을 담는 README 파일이다.
tests 디렉토리는 테스트 코드를 담는 디렉토리이다.
중요한 것은 pyproject.toml 파일인데 조금 자세히 살펴보자.
pyproject.toml 파일은 위에 서술한 대로 프로젝트의 의존성과 빌드 시스템을 정의하는 핵심 파일이다.
pyproject.toml 파일은 수기로 작성하는 파일은 아니고 poetry를 통해 의존성 설치 시 자동으로 작성된다.
pyproject.toml 파일은 총 세개의 섹션으로 구분되어 있는데 하나하나 살펴보자.
[tool.poetry]: 프로젝트 메타데이터를 정의하는 섹션으로, 프로젝트 이름, 버전 및 설명 등을 정의한다.
[tool.poetry.dependencies]: 프로젝트의 의존성을 정의하는 섹션이다.
[build-system]: 프로젝트의 빌드 시스템을 정의하는 섹션이다. 기본적으로 Poetry를 빌드 시스템으로 사용하도록 작성되어있다.
[tool.poetry]
name = "upbitopenapi"
version = "0.1.0"
description = ""
authors = ["{이름} <이메일>"]
readme = "README.md"
[tool.poetry.dependencies]
python = "^3.12"
pyjwt = "^2.8.0"
requests = "^2.31.0"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
아래 명령어를 통해 가상환경을 활성화하고, 해당 가상환경에서 사용할 Python 버전을 지정할 수 있다.
poetry env use 3.12
poetry add 명령어를 통해 의존성을 설치할 수 있고, 특정 버전을 지정하여 설치하는 것도 가능하다.
poetry add 명령어를 통해 의존성을 설치하면 자동으로 pyproject.toml 파일이 업데이트된다.
# 최신 버전 설치
$ poetry add flask
# 버전 지정하여 설치
$ poetry add flask==3.0.2
Dockerfile에 몇 가지 경로와 명령어를 작성해주면 poetry을 통해 의존성을 설치하여 컨테이너를 실행할 수 있다.
FROM python:3.12-slim
# 타임존 변경
ENV TZ Asia/Seoul
WORKDIR /app
# 컨테이너에 poetry 설치
RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -
# poetry PATH 추가
PATH="${PATH}:/root/.poetry/bin"
# poetry.lock 과 pyproject.toml 복사
COPY poetry.lock pyproject.toml /app/
# 의존성 설치
RUN poetry config virtualenvs.create false \
&& poetry install --no-interaction --no-ansi
ENV PYTHONPATH=/app
COPY . /app
CMD $APP_COMMAND
https://www.jetbrains.com/help/pycharm/poetry.html#poetry-pyproject