[Python] Poetry를 통한 Python 개발 환경 구축
Poetry란?
Poetry는 Python의 의존성 관리 및 패키징 도구입니다.
주요 기능
requirements.txt,setup.py,setup.cfg,MANIFEST.in등의 파일들을 대체하여pyproject.toml하나로 모든 설정을 관리합니다.npm의package-lock.json과 비슷한poetry.lock파일을 제공하여 각 패키지의 해시값과 의존성 트리를 기록하여 의존성 충돌을 방지하고 일관된 환경을 유지할 수 있습니다.- 손쉽게 개별 가상 환경을 구축하여 프로젝트 관리를 용이하게 합니다.
- 편리한 빌드 및 배포 기능을 제공합니다.
기존 패키지 관리 방법
Python의 기본 패키지 관리 도구는 pip를 사용하며, requirements.txt 파일을 통해 패키지 정보를 관리합니다.
Django==4.1.13
djangorestframework==3.15.1pip install -r requirements.txtpip freeze > requirements.txt와 같이 생성할 수도 있지만 의존 패키지까지 모두 포함시켜 가독성이 떨어지고 관리가 어려워진다는 단점이 있습니다.기존 가상 환경 구축 방법
python에서는 기본적으로 venv 모듈을 통하여 가상 환경 기능을 제공합니다.
python -m venv venv해당 명령어로 가상 환경 디렉토리가 생성되면 가상 환경을 활성화 할 수 있습니다.
source venv/bin/activatedeactivate를 명령어를 통해 가상 환경을 종료할 수 있습니다.
Poetry의 패키지 관리 및 가상환경 구축 방법
poetry를 사용하기에 앞서 poetry를 설치하도록 하겠습니다.
pip install poetryPoetry 설정
poetry로 프로젝트를 생성하기 위해서는 poetry new 명령어를, 기존 프로젝트에 poetry를 추가하기 위해서는 poetry init을 사용하여 기본 설정을 할 수 있습니다.
poetry new myproject --srcpoetry로 프로젝트를 생성부터 진행하도록 하겠습니다.
여기서 --src 옵션은 src 하위에 패키지가 위치하도록 설정하는 옵션입니다.
그러면 아래와 같은 구조의 프로젝트가 생성됩니다.
├── README.md
├── pyproject.toml
├── src
│ └── myproject
│ └── __init__.py
└── tests
└── __init__.pyPoetry 패키지 관리
다음과 같이 원하는 패키지를 손쉽게 설치하고 제거할 수 있습니다.
poetry add {PACKAGE}
poetry remove {PACKAGE}패키지 설치 시에는 버전을 명시하는 형태로 원하는 버전을 설정할 수도 있습니다.
poetry add django=4.2.3| Requirement | Versions Allowed |
|---|---|
| ^1.2 | >=1.2.0 < 2.0.0 |
| ~1.2 | >=1.2.0 < 1.3.0 |
| 1.2.* | >=1.2.0 < 1.3.0 |
혹은 위와 같은 표현식으로 버전을 명시할 수도 있습니다.
poetry add django@~4.2이후 install 명령을 통해 프로젝트의 pyproject.toml 파일을 읽고 의존성을 해결하고 새로운 가상환경에 필요한 패키지를 설치합니다.
그러면 poetry.lock 파일이 작성되고 모든 패키지의 해시값과 의존성이 작성된 것을 확인할 수 있습니다.
poetry installPoetry 가상환경 관리
install 명령을 통해 생성된 가상환경은 env info 명령을 통해 확인할 수 있습니다.
poetry env info
> Virtualenv
Python: 3.12.4
Implementation: CPython
Path: /Users/joonshik/Library/Caches/pypoetry/virtualenvs/myproject-6Uz1uM9E-py3.12
Executable: /Users/joonshik/Library/Caches/pypoetry/virtualenvs/myproject-6Uz1uM9E-py3.12/bin/python
Valid: True이후 poetry run 명령어나 poetry shell을 통해 Poetry 가상 환경을 통해 명령을 실행시킬 수 있습니다.
which python
poetry run which pythonwhich python은 기본 python으로 poetry run which python은 poetry 가상 환경으로 실행되어 출력되는 것을 확인할 수 있습니다.
다음과 같이 python 명령어를 실행시킬 수 있습니다.
poetry run pip list
poetry run python app.pypoetry shell 명령어를 통해서 현재 쉘에 가상 환경을 활성화할 수 있습니다.
poetry shell
which pythonwhich python을 통해 poetry 가상 환경이 활성화된 것을 확인할 수 있습니다.
exitexit 명령을 통해 가상 환경을 종료할 수 있습니다.
만약 가상 환경을 사용하지 않고 기본 python 환경을 사용하고 싶다면 poetry config 설정을 할 수도 있습니다.
poetry config virtualenvs.create false --local만약 이미 가상환경을 생성했다면 삭제한 후 다시 poetry install을 실행하면 가상 환경이 생성되지 않는 것을 확인할 수 있습니다.
poetry env list위의 출력된 가상환경을 remove 명령어를 통해 삭제할 수 있습니다.
poetry env remove {ENV}그러면 poetry install을 하더라도 가상환경이 생성되지 않는 것을 확인할 수 있습니다.
poetry install
poetry run which python
> Skipping virtualenv creation, as specified in config file.Poetry 추가 기능
그룹을 통한 의존성 관리
Poetry는 그룹을 통한 의존성 관리 기능을 제공합니다.
즉, 개발, 테스트, 운영 등의 환경을 구분하여 패키지를 관리할 수 있도록 해줍니다.
기존의 requirements.txt를 통해 환경을 분리할 때에는 개별 파일을 생성하는 방식으로 처리했습니다.
├── requirements
│ ├── common.txt
│ ├── dev.txt
│ └── prod.txt -r common.txt
dev_req==1.0하지만 Poetry는 복잡한 작업 없이 손쉽게 그룹을 구분할 수 있도록 합니다.
poetry add black --group devpoetry install --without dev
poetry install --with dev패키지 통합 관리
black이나 pytest 등 여러 라이브러리에서 Poetry를 통한 설정을 지원하여 하나의 파일에서 손쉽게 관리할 수 있습니다.
[tool.pytest.ini_options]
minversion = "6.0"
addopts = "-ra -q"
testpaths = [
"tests",
"integration",
]