Python의 패키지 관리로 일반적으로 poetry
, virtualenv
등을 사용하지만,
복수개의 프로젝트 환경에서 venv
나 virtualenv
환경을 관리하고 변경하는게 뭔가 편리하다는 생각이 들지는 않았다.
Python 패키지 종속성 문제 해결과, 운영/개발 환경의 일원화를 위해 Docker Container 환경에서 개발 하는걸 선호하고 있지만
Python 개발 환경과 패키지 관리를 좀더 효율적으로 할 수 있는 방법이 없을지, 요즘 어떤 패키지 관리도구가 유행하는지 찾아보다가 PDM
이라는 도구를 알게 되었다.
PEP-582 제안을 따르고, virtualenv
자동 생성(venv, conda 도 지원), 패키지 관리를 지원하는 도구로 생긴지는 얼마 안된 프로젝트 였다.
Python 3.7이상이 설치되어 있어야 하며, 다음과 같이 설치 스크립트를 이용하여 설치할 수 있다.
$ curl -sSL https://raw.githubusercontent.com/pdm-project/pdm/main/install-pdm.py | python3 -
설치 후 다음과 같이 환경변수를 등록한다.
$ export PATH=/Users/[user]/Library/Python/3.9/bin:$PATH
혹은 brew를 이용해 설치할수도 있다.
$ brew install pdm
oh my zsh
의 경우 다음과 같이 실행하여 shell 자동 완성 기능을 추가할 수 있다.
$ mkdir $ZSH_CUSTOM/plugins/pdm
$ pdm completion zsh > $ZSH_CUSTOM/plugins/pdm/_pdm
PEP-582
는 종속성 관리를위한 로컬 패키지 디렉토리 표준으로 프로젝트 루트 아래의 __pypackages__
디렉토리에 된다.
PEP582 패키지를 인식하게 하려면 환경 설정에 pdm/pep582/sitecustomize.py
를 추가하여야 하며, 다음과 같은 방법으로 추가할 수 있다.
$ pdm --pep582 >> ~/.bash_profile
프로젝트 디렉터리에서 pdm init
명령어로 프로젝트를 초기화 한다.
$ pdm init
Creating a pyproject.toml for PDM...
Please enter the Python interpreter to use
0. /usr/bin/python3 (3.9)
1. /Users/violetstair/Library/Application Support/pdm/venv/bin/python (3.9)
Please select (0): 1
Using Python interpreter: /Users/violetstair/Library/Application Support/pdm/venv/bin/python (3.9)
Is the project a library that will be uploaded to PyPI [y/n] (n):
License(SPDX name) (MIT):
Author name (VioletStair):
Author email (violetstair@gmail.com):
Python requires('*' to allow any) (>=3.9):
Changes are written to pyproject.toml.
.pdm.toml
와 pyproject.toml
파일이 생기는 것 을 확인할 수 있다.
pyproject.toml
는 PEP-518을 따르는 프로젝트 종속성 및 패키징 구성 정보를 포함하는 파일이다.
.pdm.toml
은 pdm 설정 관련 설정 파일로 local 환경 정보를 포함한다.
pmd venv create [version]
을 이용하여 venv 환경을 추가할 수 있으며,
$ pdm venv create 3.9
Virtualenv /Users/violetstair/workspace/python/test/.venv is created successfully
pdm venv list
를 통해 venv 환경 목록 및 정보를 확인할 수 있다.
$ pdm venv list
Virtualenvs created with this project:
- in-project: /Users/violetstair/workspace/python/test/.venv
$ eval $(pdm venv activate in-project)
$ deactivate
$ pdm add fastapi
$ pdm add -d pytest
$ pdm remove requests
$ pdm add -e ./sub-package
$ pdm list
테스트 코드 혹은 코드 lint를 실행 시키때 venv
환경을 활성화 할 필요 없이 run
명령어고 실행 할 수 있다.
$ pdm run nox
$ pdm run pytest
다른 사용자와 프로젝트를 공유할 때 .pdm.toml
파일은 로컬 환경 정보가 들어 있어, git
에 포함 시키지 말아야 한다.
sync
옵션을 이용하면 .venv
및 .pdm.toml
파일 등 로컬 환경 및 종속성 동기화가 자동으로 이루어 진다.
$ pdm sync
python.use_venv is on, creating a virtualenv for this project...
⠼ Resolving packages from lockfile...Virtualenv is created successfully at /Users/violetstair/workspace/python/test/.venv
Synchronizing working set with lock file: 13 to add, 0 to update, 0 to remove
✔ Install iniconfig 1.1.1 successful
✔ Install pluggy 1.0.0 successful
✔ Install idna 3.4 successful
✔ Install packaging 21.3 successful
✔ Install attrs 22.1.0 successful
✔ Install pyparsing 3.0.9 successful
✔ Install fastapi 0.87.0 successful
✔ Install sniffio 1.3.0 successful
✔ Install anyio 3.6.2 successful
✔ Install typing-extensions 4.4.0 successful
✔ Install starlette 0.21.0 successful
✔ Install pytest 7.2.0 successful
✔ Install pydantic 1.10.2 successful
🎉 All complete!
실제 프로젝트에 적용했을 때는 모르겠지만 테스트를 위해 사용해 보았을 때 npm
과 많이 유사한것 같다.
개인적으로 poetry
, virtualenv
와 같은 기존 도구들을 별로 선호하지 않아 docker container 기반으로 작업하고는 했는데,
pdm
는 충분히 쓸만하고, local
개발환경에서는 docker를 쓰지 않아도 될것같다는 생각이 든다.