Computer Engineering/Python
python 패키지 관리 툴 Poetry 설정해보기
soohey
2022. 11. 22. 15:03
파이썬 프로젝트를 관리할 때 requirements.text로 종속성 관리하는게 불편해서 poetry를 사용해보았다.
요구사항
- python 3.7 이상
poetry를 쓰면 뭐가 좋을까?
- 종속성 관리
- 자체 환경 분리
- 직관적인 CLI
종속성 관리
-
- tool.poetry.depencies 에 직접 추가
- poetry add 로 추가
- .toml 파일
환경 관리
- 종속성 그룹 관리
- poetry add pytest --group test
Virtualenv VS Poetry
1. 프로젝트 재배치
- Virtrualenv
- 프로젝트 폴더를 이동하거나 이름 변경시 경로가 변경되지 않음.
- Poetry
- $HOME 에 환경을 자동으로 생성함
- 프로젝트를 재배치할 때 동일한 환경을 사용하도록 지시 가능하다. → 테스트 목적으로 유용함 (파이썬 버전도 바꾸기 가능)
poetry env use <env location>
poetry env use python3.8
poetry env use python3.6
2. 개발 종속성
- virstualenv
- 격리된 환경에서 종속성 관리
- 프로덕션 환경과 개발 환경을 구분하기 위해 requestment.txt를 두개이상으로 관리 → 보안 누출의 위험성
- poetry
poetry add -D black
- -D 프로젝트에 새 패키지 추가시 플래그를 사용해 개발 전용으로 지정함
poetry install --no-dev
- 프로덕션 서버에 종속성 설치시 ‘no-dev’ 플래그로 개발 종속성 필터링
poetry install --remove-untracked
- ‘remove-untracked’ 과거에 사용했던 중복 패키지 제거
3. 구성원과의 일관된 버전 관리
버전의 불일치를 해결하고 싶다면?
- virtualenv
- pip freeze → 패키지 버전 불일치, python 버전을 잡지 못함, requestment 파일에 수동으로 추가하고 버전 지정해야함
- poetry
- .toml → virtualenv의 requestment.txt
- 다른점
- poetry는 패키지 설치시 poetry.lock이 있는지 확인 → 있으면 lock 파일에서 종속성 가져옴. lock 파일은 poetry만이 edit/create 가능
- lock 파일을 커밋하고 공유
요약
- 개발 / 프로덕션 종속성 구별이 어려움
- 프로젝트 폴더 재배치 및 이름 바꾸는 어려움
- 팀 간의 일관된 환경 유지의 어려움
- python용 npm 같은 패키지 도구 = poetry
프로젝트 생성
- virtualenv
- 프로젝트 파일 생성 → env 생성
- poetry
poetry new myproject
설치시 오류 사항
⚠️ ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1122)
- application > python 3.9 > install certificate … 실행 후
⚠️ Poetry 명령어가 없을 때
- ./zshrc 파일에 export PATH="/etc/poetry/bin/:$PATH" 추가
Docker build시 고려사항
- poetry update시 빌드가 멈추는 오류 대비 → POETRY_VERSION : poetry 버전 고정하기
pip install ‘poetry==$POETRY_VERSION’
- .toml
[build-system]
# Should be the same as `$POETRY_VERSION`:
requires = ["poetry>=1.0"]
build-backend = "poetry.masonry.api"
- pyproject.toml요구 사항을 캐시 하고 poetry.lock파일이 변경될때만 다시 설치 → 빌드가 느려짐을 방지
COPY poetry.lock pyproject.toml /code/
FROM python:3.6.6-alpine3.7
ARG YOUR_ENV
ENV YOUR_ENV=${YOUR_ENV} \\
PYTHONFAULTHANDLER=1 \\
PYTHONUNBUFFERED=1 \\
PYTHONHASHSEED=random \\
PIP_NO_CACHE_DIR=off \\
PIP_DISABLE_PIP_VERSION_CHECK=on \\
PIP_DEFAULT_TIMEOUT=100 \\
POETRY_VERSION=1.0.0
# System deps:
RUN pip install "poetry==$POETRY_VERSION"
# Copy only requirements to cache them in docker layer
WORKDIR /code
COPY poetry.lock pyproject.toml /code/
# Project initialization:
RUN poetry config virtualenvs.create false \\
&& poetry install $(test "$YOUR_ENV" == production && echo "--no-dev") --no-interaction --no-ansi
# Creating folders, and files for a project:
COPY . /code
https://stackoverflow.com/questions/53835198/integrating-python-poetry-with-docker