PDM:下一代 Python 包管理器
引言
Python Development Master (PDM) 是一款现代化的 Python 包管理器,旨在提供更高效、更灵活的项目依赖管理解决方案。与传统的包管理器(如 Pipenv、Poetry)不同,PDM 基于 PEP 582(Python 本地包目录)提案,不再强制依赖虚拟环境,从而有效避免了虚拟环境嵌套可能引发的冲突和管理复杂性。PDM 的核心优势在于其独特的设计理念和强大的功能集,使其成为 Python 开发者管理项目依赖的有力工具
PDM 的核心特性
PDM 的设计理念聚焦于提升开发者体验和项目管理效率,其主要特性包括:
- 无需虚拟环境:PDM 创新性地支持 PEP 582 提案,允许项目依赖直接安装在项目根目录下的
__pypackages__目录中,从而摆脱了传统虚拟环境的束缚。这简化了环境管理,并使得项目更加自包含和可移植 - 高效的依赖解析器:PDM 内置了一个简单而快速的依赖解析器,尤其在处理大型二进制包时表现出色,能够迅速计算并锁定所有直接和间接依赖的版本
- 灵活的插件系统:PDM 提供了强大且可扩展的插件系统,允许用户根据自身需求定制和扩展功能,极大地增强了其灵活性和适应性
- 兼容 PEP 517 和 PEP 621:PDM 完全兼容 PEP 517 (用于构建发布包,支持源码格式与 wheel 格式) 和 PEP 621 (用于项目元数据格式),确保了与 Python 生态系统的良好集成和标准化
- 中心化安装缓存:类似于 pnpm,PDM 实现了中心化的安装缓存机制,可以有效节省磁盘空间,避免重复下载相同的包

PDM 的安装
PDM 的安装方式多样,官方推荐使用 pipx 进行安装,因为 pipx 专为安装和运行命令行应用程序而设计,能够将 PDM 隔离在其自身的虚拟环境中,避免与系统 Python 环境或其他项目产生冲突。PDM 要求 Python 版本为 3.7 或更高
1 | pipx install pdm |
python pip 直接安装1
pip install pdm
项目初始化与依赖管理
1. 创建空白项目
通过以下命令可以快速创建一个 PDM 管理的空白项目:
1 | mkdir my-project && cd my-project |
pdm init 命令会引导用户完成项目初始化过程,包括选择 Python 解释器、项目名称、版本、许可证、作者信息以及所需的 Python 版本范围等。完成初始化后,项目目录下会生成两个关键文件:
.pdm-python:存储用户选择的 Python 解释器路径,供 PDM 后续命令使用。可以通过pdm use命令更改pyproject.toml:PDM 的项目配置文件,遵循 PEP 621 标准,记录了项目的元数据和依赖信息
2. 添加、移除和查看依赖
PDM 使用 pdm add 命令来添加项目依赖。例如,为项目添加 ragas 库:
1 | pdm add ragas==0.3.5 |
执行 pdm add 后,PDM 会自动执行以下操作:
- 将新添加的依赖及其版本信息记录到
pyproject.toml文件中。 - 解析所有依赖关系,并生成或更新
pdm.lock文件。pdm.lock文件精确锁定了所有直接和间接依赖包的版本,确保了环境的可复现性
若要移除依赖,可以使用 pdm remove 命令:
1 | pdm remove ragas |
查看已安装依赖的详细信息,可以使用 pdm show 或 pdm list 命令:
1 | pdm show ragas |
3. 配置 PyPI 源
为了加快包的下载速度,可以配置 PDM 使用国内的 PyPI 镜像源。可以设置全局默认源,也可以添加额外的源:
1 | 更改默认源为清华源 |
4. 锁定和同步依赖
pdm lock 命令会根据 pyproject.toml 中声明的依赖,解析并生成一个 pdm.lock 文件,确保每次安装的依赖环境都是一致的:
1 | pdm lock |
pdm sync 命令则会根据 pdm.lock 文件中的精确版本信息,安装或更新项目依赖,确保项目环境与锁文件保持同步。这在团队协作或部署时尤为重要
虚拟环境与 Python 解释器管理
尽管 PDM 的核心特性是无需虚拟环境,但它也提供了对虚拟环境的良好支持,以适应不同开发者的工作流和 IDE 工具的兼容性
1. 创建和使用虚拟环境
PDM 允许用户创建和管理虚拟环境:
1 | 查看可用的 Python 解释器 |
2. 安装其他 Python 解释器
PDM 支持从 @indygreg’s python-build-standalone 安装其他 Python 解释器,方便开发者管理多个 Python 版本:
1 | 查看可下载的 Python 版本列表 |
3. 优化依赖解析速度
在执行 pdm install 或 pdm lock 命令时,如果遇到依赖解析耗时过长的情况,可以通过在 pyproject.toml 文件中精确指定 Python 版本范围来优化速度,例如:
1 | [project] |
运行命令与脚本别名
PDM 提供了 pdm run 命令来在项目环境中执行脚本或命令。为了简化复杂命令的执行,可以在 pyproject.toml 中配置命令别名:
1 | [tool.pdm.scripts] |
配置别名后,可以直接通过 pdm run start 来执行对应的命令
方案兼容
PDM 足够好用,也足够开放,如果你当前使用的是其他的包管理器,比如 pipenv,poetry,requirements.txt ,你也可以很方便的迁移到 pdm 中来,下面以导入导出 requirements为例1
2
3
4
5 从已有的requirements.txt文件导入
pdm import -f requirements requirements.txt
pdm 导出requirements.txt文件
pdm export -o requirements.txt
总结
- 优点: PDM 作为一款现代 Python 包管理器,凭借其无需虚拟环境、高效依赖解析、灵活插件系统以及对新 PEP 标准的良好支持,为 Python 项目管理带来了全新的体验。它不仅解决了传统包管理器在虚拟环境嵌套等场景下的痛点,还通过中心化缓存等机制提升了开发效率。无论是个人项目还是团队协作,PDM 都提供了一个强大而便捷的解决方案
- 缺点: 执行
pdm add和pdm lock等操作时,因为要解析包或子包的依赖关系,会导致下载时耗时很长,在非常明确要添加的版本号和依赖关系的时候,其实是不如用pip install命令更敏捷
参考文献
- [1] Frost Ming. PDM - 一款新的 Python 包管理器. Frost’s Blog. https://frostming.com/2020/02-28/pdm-introduction/
- [2] 知源笔记. PDM:现代 Python 项目管理利器. https://zhiyuanbiji.cn/notes/808e9c4af59bb102aec5d78483cc7474
- [3] iswbm. 12.7 【本地环境】方案六:使用 PDM. Python中文指南. https://python.iswbm.com/c12/c12_07.html#why-pdm
- [4] PEP 582 — Python local packages directory. https://peps.python.org/pep-0582/
- [5] PEP 517 — A build system independent format for source trees. https://peps.python.org/pep-0517/
- [6] PEP 621 — Storing project metadata in pyproject.toml. https://peps.python.org/pep-0621/
- [7] indygreg/python-build-standalone. GitHub. https://github.com/indygreg/python-build-standalone
- [8] pnpm. https://pnpm.io/