PDM 入门指南:现代 Python 项目与依赖管理
PDM 是遵循 PEP 标准的现代 Python 项目管理器:依赖声明与锁定、依赖分组、Python 版本管理、脚本任务。本文讲解 PDM 的核心概念与最佳实践。
直接回答:PDM 是一个把 PEP 标准吃透的 Python 项目与依赖管理器:pyproject.toml 声明依赖、lock 文件精确锁定、依赖分组区分开发与生产、还能管理 Python 版本——把其他语言生态(npm/cargo)的成熟体验带进了 Python。
为什么是 PDM
Python 包管理的旧世界(pip + requirements.txt)缺少锁定机制,"在我机器上能跑"是常态。PDM 全面拥抱 PEP 标准(621 元数据;另保留被拒绝的 582 提案的工具级实现),解析器现代,依赖分组、锁定文件、可复现安装开箱即有。
安装与初始化
pip install pdm # 或官方安装脚本
pdm init # 交互式初始化项目
pdm init 生成标准 pyproject.toml——项目元数据、依赖声明都写在里面,与构建后端无关,天然面向未来。
依赖管理
pdm add requests # 加依赖并锁定
pdm add -d pytest # 开发依赖
pdm remove requests
pdm update # 升级
pdm list --graph # 依赖树
每次 add 自动做三件事:写入 pyproject → 解析全量依赖 → 更新 pdm.lock。团队成员 pdm sync 即可得到与你按锁文件解析的依赖环境;平台和系统库仍需验证。
依赖分组
pdm add -dG test pytest pytest-cov # 测试组
pdm add -dG lint ruff # lint 组
生产部署 pdm sync --prod,只装运行时依赖;CI 里测试组、lint 组各取所需。比 requirements-dev.txt 那套时代眼泪优雅得多。
Python 版本管理
pdm python install 3.13 # 安装指定版本
pdm use 3.13 # 项目切换解释器
PDM 可以直接下载管理 Python 版本(借助 python-build-standalone),pyenv 的职责它也能接。
PEP 582:不用虚拟环境的选项
PEP 582 已被拒绝,不是 Python 标准;PDM 保留工具级本地包目录支持,但官方推荐虚拟环境。PDM 支持(__pypackages__):依赖装在项目目录内,免激活虚拟环境。习惯 venv 的也可以让 PDM 用虚拟环境模式——两种都支持,团队统一即可。
脚本任务
[tool.pdm.scripts]
test = "pytest"
lint = "ruff check ."
start = "uvicorn app.main:app --reload"
pdm run test 一条命令跑测试,环境自动就绪——Makefile 可以退休了。
常见问题(FAQ)
Q:PDM 和 Poetry 怎么选?
A:理念相近。PDM 和现代 Poetry 均支持标准 project 元数据,锁文件和插件仍有区别。新项目两者皆可,PDM 的标准化路线长期更省心。
Q:PDM 和 uv 怎么选?
A:uv 速度极致、工具链全;PDM 的项目工作流(分组、脚本、PEP 582)设计细腻。看重工作流选 PDM,看重速度选 uv——都是好答案。
Q:发布库到 PyPI 支持吗?
A:pdm build 与 pdm publish 全套支持,后端默认 pdm-backend。库项目的打包发布体验是 PDM 的传统强项。
官方参考
本文基于官方文档整理,未进行运行时或性能测试。示例中的业务函数、数据模型和部署地址需结合项目补全;局部片段不等同于完整生产应用。