在試用了一段時間的uv和pdm之后,上個月(2025.06)開始,逐步把用了幾年的poetry替換成了pdm+uv(pipx install pdm uv && pdm config use_uv true)
## 為什么poetry -> pdm:
1. 通過ssh連接到服務器并使用poetry shell激活虛擬環境之后,如果沒有主動退出,那么該進程有可能一直在跑著,即使你已經斷開了服務連接,有時候這個進程甚至會占用100%的CPU
2. poetry需要額外安裝poetry-plugin-version插件才能支持dynamic version,而pdm自身就支持
3. poetry需要加插件才能支持換國內的鏡像源,而pdm直接用自帶的config命令就行
4. poetry居然沒有官方的github action構件,寫ci時還得手動pip install poetry
5. poetry最大的痛點是lock賊慢,依賴比較多的項目,到最后懶得更新lock文件了,直接手動更新pyproject.toml并通過pip來安裝和升級依賴
## 為什么時pdm+uv,而不是只用uv:
1. 在國外一般使用清華阿里等pypi鏡像源,uv的lock文件里會攜帶源信息,這就導致即使服務器環境和本地環境執行uv lock會產生不同的結果
2. uv的優勢是快,但pdm在啟動use_uv之后,速度已經相差不大
3. pdm在工程化支持這一塊做的相對較好,例如pdm new my-project可以直接創建新項目,而uv目前(uv 0.7.20)并不支持,再者pdm是python開發的,寫插件很方便,如:pdm self add pdm-plugin-i
結論:江山代有人才出,長江后浪推前浪。用了好幾年的poetry,雖然各種槽點,但確實比pip+requirements.txt好一些。node前端的包管理工具,除了npm就是yarn和pnpm,而Python后端卻是conda、pipenv、poetry、flit、hatch、uv、pdm、setuptools-scm、Rye讓人眼花繚亂。其中uv作為后起之秀,在安裝和解析包的速度這一塊真的是一騎絕塵,而pdm在支持PEP新特性這一塊相當給力。期待pdm+uv能夠一統江湖,結束紛爭亂象。
附:pdm項目開發環境自定義命令實例
[build-system]
requires = ["pdm-backend"]
build-backend = "pdm.backend"[dependency-groups]
dev = ["fast-dev-cli>=0.16.2,<1"][tool.pdm.scripts]
up = 'pdm update -G :all'
type = "pdm run mypy ."
tree = 'pdm list --tree'
deps = 'pdm sync -G :all {args}'
prod = 'pdm install --prod --frozen'
fresh = {composite = ["up", "deps"]}
test = 'pdm run fast test'
style = {composite = ["ruff format", "ruff check --fix {args}"]}
check = 'pdm run fast check {args}'
lint = 'pdm run fast lint {args}'
bump = "pdm run fast bump patch --commit {args}"
tag = "pdm run fast tag {args}"
start = {composite = ["pre-commit install", "deps"]}
ci = {composite = ["deps", "check", "test"]}
PDM Scripts - PDM
不想要uv和pdm lock的話,還可以用回pip:
pdm run python -m ensurepip
pdm run python -m pip install --upgrade pip
pdm run python -m pip install --group dev -e .
pdm add <prod-dep> --no-lock # 只安裝包和更新pyproject.toml,不更新pdm.lock
另外pdm/uv換源可以這樣:
pipx install pip-conf-mirror
pip-conf --pdm qinghua # 給pdm換清華源
pip-conf --uv ali # 給uv換阿里源