All Articles

PDM

PDM 사용해보기

Python의 패키지 관리로 일반적으로 poetry, virtualenv 등을 사용하지만, 복수개의 프로젝트 환경에서 venvvirtualenv 환경을 관리하고 변경하는게 뭔가 편리하다는 생각이 들지는 않았다. Python 패키지 종속성 문제 해결과, 운영/개발 환경의 일원화를 위해 Docker Container 환경에서 개발 하는걸 선호하고 있지만 Python 개발 환경과 패키지 관리를 좀더 효율적으로 할 수 있는 방법이 없을지, 요즘 어떤 패키지 관리도구가 유행하는지 찾아보다가 PDM 이라는 도구를 알게 되었다.

PEP-582 제안을 따르고, virtualenv 자동 생성(venv, conda 도 지원), 패키지 관리를 지원하는 도구로 생긴지는 얼마 안된 프로젝트 였다.

PDM

PDM Github

설치 하기

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

shell 자동 완성 기능 추가

oh my zsh의 경우 다음과 같이 실행하여 shell 자동 완성 기능을 추가할 수 있다.

$ mkdir $ZSH_CUSTOM/plugins/pdm
$ pdm completion zsh > $ZSH_CUSTOM/plugins/pdm/_pdm

PEP-582 활성화

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.tomlpyproject.toml 파일이 생기는 것 을 확인할 수 있다.

pyproject.tomlPEP-518을 따르는 프로젝트 종속성 및 패키징 구성 정보를 포함하는 파일이다.

.pdm.toml은 pdm 설정 관련 설정 파일로 local 환경 정보를 포함한다.

venv

venv 추가 하기

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

venv 활성화

$ eval $(pdm venv activate in-project)

venv 비활성화

$ deactivate

패키지 추가

$ pdm add fastapi

개발 전용 패키지 추가

$ pdm add -d pytest

패키지 삭제

$ pdm remove requests

로컬 패키지 추가

$ pdm add -e ./sub-package

패키지 목록 조회

$ pdm list

pdm list

test code 실행

테스트 코드 혹은 코드 lint를 실행 시키때 venv 환경을 활성화 할 필요 없이 run 명령어고 실행 할 수 있다.

$ pdm run nox

$ pdm run pytest

sync

다른 사용자와 프로젝트를 공유할 때 .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를 쓰지 않아도 될것같다는 생각이 든다.

Published Nov 21, 2022

Right Thoughts, Right Words, Right Action