python 개발 환경, Poetry로 관리하기

duo2208·2022년 8월 12일
0

Web

목록 보기
2/2
post-thumbnail

어떤 패키지 매니져를 사용해야할까?


파이썬에서 사용하는 개발 환경은 여러 가지가 있지만, 대부분은 pip 를 주로 이용했을 겁니다.

저 역시도 그랬습니다. 하지만 pip 를 사용한 프로젝트가 성장하면서 의존하는 패키지가 많아졌고, 문제 발생 지점 역시 많아졌습니다.
이 문제를 해결하기 위해 여러 패키지 매니져가 생겼고 그 중 저는 🎤 Poetry를 사용해보고자 합니다.

conda

  • pandas, numpy 같은 데이터 사이언스에 필요한 여러 패키지들이 같이 설치된다.
  • 쥬피터 노트북을 쓸 때는 좋지만, 헤비하다.
  • 깨끗한 파이썬에 의존성을 설치하는게 더 가볍기 때문에 추천되지 않는다.

virtualenv

  • 파이썬에 내장되어 있는 공식 가상환경 모듈로, 가장 오래되고 많이 사용되는 방식이다.

  • pip 가 내장되어 있으며, requirements.txt 로 패키지를 관리한다.

  • 하지만 이 pip 의 설계가 부실해서 requirements.txt 의 관리가 어렵다. 사람이 직접 수동으로 관리해야 하다보니 개발 환경에서는 잘 돌던 코드가 배포 시에 작동하지 않는 경우가 허다하다.

    • pip 는 ..
    • namespace 가 없다.
    • 의존관계 파악이 어렵다. 게다가 pip uninstall 은 dependencies 까지 삭제하지는 않는다.
    • 기본적으로 global 에 모든 라이브러리를 설치한다. 개발용, 배포용 패키지가 이원화 되지 않는다.
    • lock 파일이 없어서 프로젝트 참여자간 의존성 일치가 힘들다.
    • PHP의 패키지 관리자인 composer 에서도 이미 오래전부터 잘 지원하는 기능이 pip 에는 없다는 것이 놀랍다.
  • 가상환경을 활성화하기 위해 매번 프롬포트를 켜서 activate 명령을 수행해야하는 것도 불편하다.

poetry

  • pip 의 문제점을 해결하기 위해 탄생 된 패키지 관리 매니져이다.

  • Dependency Locking
    .lock 파일과 .toml 파일을 자동으로 생성 및 업데이트 해준다.

  • Dependency resolving

    $ pip install PyconKorea

    프로젝트에 꼭 필요한 패키지인 PyconKorea 라고 하는 패키지를 설치했다고 가정해보자. 그리고 이 PyconKorea 라고 하는 패키지는 A, B, C 라는 외부 모듈로 이루어져 있다. 그 중 A 모듈엔 A' 이라는 다른 외부 모듈이 사용되고 있다.

    이 때 A' 모듈의 버전이 바뀌어, A에도 영향을 미치게 되었다. A도 덩달아 패치가 필요해진 것이다. 옛날 버전 A를 상정하고 만든 프로젝트라 버전 때문에 설치가 제대로 되지않는 이용자가 발생할 것이다.
    poetry는 알아서 서로 호환되는 버전을 설치함으로써 Dependeny Resloving 실패를 방지해준다.

  • Virtual Environment
    프로젝트 별 관리가 가능하다. poetry는 가상 환경 여부를 확인한 뒤, 기존 환경 혹은 새로 만들어 자동으로 관리해준다.
    개인적으로 가상환경 activate 여부 파악이 쉬워서 편리했다.


더 많은 글 보기


Poetry 사용하기


1. Installation

설치 방법은 공식문서에 잘 나와 있어 간략하게 적었습니다.
터미널을 열고 명령어를 하나씩 입력합니다.

(1) osx / linux / bashonwindows install instructions

$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

(2) 설치 확인

$ poetry --version

2. Basic Usage

(1) 프로젝트 폴더 생성

Poetry를 사용하기 위한 장고 디렉터리를 생성한 뒤 들어갑니다.

$ mkdir basic-project
$ cd basic-project
$ django-admin startproject config .

(2) 프로젝트 초기 세팅

$ poetry init

커맨드를 입력하면 package namesversion constraints 등을 입력하라고 합니다. 이 부분은 나중에 값 변경이 가능하니 엔터를 눌러 기본 값으로 채웁니다.

이렇게 init 을 하고 나면 pyproject.toml 라는 의존선 관리 파일이 생깁니다. pyproject.toml 는 poetry 전용 requirements.txt 로 생각하면 됩니다.

*** pyproject.toml ***

[tool.poetry]
name = "basic-project"
version = "0.1.0"
description = ""
authors = ["jimin <ooo@ooooo.org>"]

[tool.poetry.dependencies]
python = "^3.10"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

3. Specifying dependencies

[tool.poetry.dependencies][tool.poetry.dev-dependencies] 에 수동으로 패키지를 직접 기입하여 의존성 관리를 할 수도 있지만,

⭐ 이제 우리는 poetry add 서브 커맨드를 사용하여 자동으로 관리 할 수 있습니다.

저는 Django dependency 를 추가해 보겠습니다.

$ poetry add django==4.0

아래와 같은 출력이 나오고,

Updating dependencies
Resolving dependencies...

Writing lock file

Package operations: 0 installs, 1 update, 0 removals

  • Updating tzdata (2022.1 -> 2022.2)

pyproject.toml 에 django 의존성이 추가 된 것이 확인되며, poetry.lock 파일이 생겼습니다.

*** pyproject.toml ***

[tool.poetry]
name = "basic-project"
version = "0.1.0"
description = ""
authors = ["jimin <ooo@ooooo.org>"]

[tool.poetry.dependencies]
python = "^3.10"
Django = "4.0"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

4. Using your virtual environment

최초로 poetry add 을 했다면, 그 과정에서 자동으로 가상 환경이 생성됩니다.
list 커맨드를 입력하면 가상 환경이 하나 생성되어 있는 것을 확인할 수 있습니다.

$ poetry env list
basic-project-VL780swx-py3.10 (Activated)

0개의 댓글