🚀 官方文档:https://pdm.fming.dev/ 🚀 GitHub 地址:https://github.com/pdm-project/pdm 🚀 原作博客:https://frostming.com/2020/02-28/pdm-introduction/ 🚀 参考文档:

说到 Python 的包管理,我们第一时间想到的是pipconda这些常用工具,如果是玩工程比较多的同学,像PipenvPoetry这些包管理工具应该也不会陌生。这些包管理器都是基于虚拟环境的,而虚拟环境的主要目的就是为了隔离项目开发环境,但如果涉及到虚拟环境中继续嵌套虚拟环境,这些包就无法达到期望的效果。

下面我们介绍一款新的包管理工具——PDM(Python Development Master),它受到 PEP582 以及 node 安装和管理库文件方式的启发,并且整个过程完全不需要创建虚拟环境,帮助我们以本地项目库形式创建和管理不同的 Python 环境。

:::info 📝 备注
——————————
查阅了一下原作者的博客,讲述了当初开发这个工具的初衷,主要是因为 Pipenv 和 Poetry 都不够好用,所以才有了 PDM 的诞生。

此外,PDM 作者是 PyPI 成员、Pipenv 目前主要维护者之一,并且该项目一直处于频繁更新的状态。 :::

1. 功能亮点

PDM 具备以下特性:

  • PEP582 本地项目库目录,支持安装与运行命令,完全不需要虚拟环境
  • 简单且相对快速的依赖关系解析器,主要用于大型二进制包的发布
  • 兼容 PEP517 的构建后端
  • PEP621 项目元数据格式
  • 拥有灵活且强大的插件系统
  • pnpm一样的中心化缓存安装,节省磁盘空间

    2. 安装

    PDM 的安装需要 Python 版本在 3.7+,并且可以运行在 Windows、Linux、MacOS 这些平台上。

:::info 📝 备注
——————————
对于 Python 版本没有限制,但是安装 PDM 本身是需要 Python 3.7+。 :::

PDM 官方提供了多种安装方式,这里我们推荐采用pipx方式进行安装。

  1. $ pip install --user pipx
  2. $ pipx ensurepath
  3. $ pipx install pdm
  4. installed package pdm 1.13.4, installed using Python 3.9.5
  5. These apps are now globally available
  6. - pdm.exe
  7. done! 🌟

3. 初始化PDM

执行pdm init命令就会开始初始化,初始化的时候,会让我们选择项目的一些信息:

  • 是否需要上传 PyPI
  • 项目名称
  • 项目版本信息
  • License 类型
  • 作者信息
  • 邮箱信息
  • 依赖的 Python 版本

完成初始化之后,PDM 会将我们的选择以 toml 格式写入 pyproject.toml 配置文件中,并且还会生成一个 .pdm.toml 文件:

  1. [project]
  2. name = "pdmtest"
  3. version = "0.1.0"
  4. description = ""
  5. authors = [
  6. {name = "yumingmin", email = "yumingmin@xinye.com"},
  7. ]
  8. license-expression = "MIT"
  9. dependencies = []
  10. requires-python = ">=3.9"
  11. [project.urls]
  12. Homepage = ""
  13. [tool.pdm]
  14. [build-system]
  15. requires = ["pdm-pep517>=0.12.0"]
  16. build-backend = "pdm.pep517.api"

4. 基础用法

4.1 安装包

和 Poetry 一样,安装第三方库使用add命令,但pdm会比poetry好用,主要体现子分组上:

  1. $ pdm add rich
  2. Adding packages to default dependencies: rich
  3. 🔒 Lock successful
  4. Changes are written to pdm.lock.
  5. Changes are written to pyproject.toml.
  6. Resolving packages from lockfile...
  7. Synchronizing working set with lock file: 3 to add, 0 to update, 0 to remove
  8. Install commonmark 0.9.1 successful
  9. Install pygments 2.11.2 successful
  10. Install rich 12.0.0 successful
  11. Installing the project as an editable package...
  12. Update pdmtest 0.1.0 -> 0.1.0 successful
  13. 🎉 All complete!

4.2 查看包

使用pdm list命令列出当前环境已经安装的包,该命令还有--graph--json参数可以使用:

  1. $ pdm list
  2. Package Version Location
  3. ------------------ --------- --------------------
  4. certifi 2021.10.8
  5. charset-normalizer 2.0.12
  6. commonmark 0.9.1
  7. idna 3.3
  8. pygments 2.11.2
  9. requests 2.27.1
  10. rich 12.0.0
  11. urllib3 1.26.9
  12. $ pdm list --graph
  13. pdmtest 0.1.0 [ required: This project ]
  14. ├── requests 2.27.1 [ required: >=2.27.1 ]
  15. ├── certifi 2021.10.8 [ required: >=2017.4.17 ]
  16. ├── charset-normalizer 2.0.12 [ required: ~=2.0.0 ]
  17. ├── idna 3.3 [ required: <4,>=2.5 ]
  18. └── urllib3 1.26.9 [ required: <1.27,>=1.21.1 ]
  19. └── rich 12.0.0 [ required: >=12.0.0 ]
  20. ├── commonmark 0.9.1 [ required: <0.10.0,>=0.9.0 ]
  21. └── pygments 2.11.2 [ required: <3.0.0,>=2.6.0 ]

如果需要查看某个包的具体详情,可以使用pdm show命令:

  1. $ pdm show requests
  2. Name: requests
  3. Latest version: 2.27.1
  4. Latest stable version: 2.27.1
  5. Installed version: 2.27.1
  6. Summary: Python HTTP for Humans.
  7. Requires Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*
  8. Author: Kenneth Reitz
  9. Author email: me@kennethreitz.org
  10. License: Apache 2.0
  11. Homepage: https://requests.readthedocs.io
  12. Project URLs: Documentation: https://requests.readthedocs.io
  13. Source: https://github.com/psf/requests
  14. Platform: UNKNOWN
  15. Keywords:

4.3 删除包

使用pdm remove来删除包

  1. $ pdm remove requests
  2. Removing packages from default dependencies: requests
  3. Changes are written to pyproject.toml.
  4. 🔒 Lock successful
  5. Changes are written to pdm.lock.
  6. Resolving packages from lockfile...
  7. Synchronizing working set with lock file: 0 to add, 0 to update, 5 to remove
  8. Remove certifi 2021.10.8 successful
  9. Remove idna 3.3 successful
  10. Remove charset-normalizer 2.0.12 successful
  11. Remove urllib3 1.26.9 successful
  12. Remove requests 2.27.1 successful
  13. Installing the project as an editable package...
  14. Update pdmtest 0.1.0 -> 0.1.0 successful
  15. 🎉 All complete!

4.4 更新包

使用pdm update来更新全部包,或者使用pdm update <pkg>来更新指定包:

  1. $ pdm update
  2. $ pdm update requests

5. 项目配置

终端中执行pdm config即可打印 PDM 配置以及项目配置,当然,我们可以不使用全局配置,可在项目下 .pdm.toml 文件中添加指定参数和值:

  1. $ pdm config
  2. Home configuration (C:\Users\yumingmin\.pdm\config.toml):
  3. auto_global = False
  4. build_isolation = True
  5. cache_dir = C:\Users\yumingmin\AppData\Local\pdm\pdm\Cache
  6. check_update = True
  7. install.cache = False
  8. install.cache_method = symlink
  9. install.parallel = True
  10. project_max_depth = 5
  11. pypi.json_api = False
  12. pypi.url = https://pypi.douban.com/simple/
  13. pypi.verify_ssl = True
  14. python.use_pyenv = True
  15. python.use_venv = False
  16. strategy.resolve_max_rounds = 10000
  17. strategy.save = minimum
  18. strategy.update = reuse
  19. Project configuration (I:\Demos\pdm-demo\.pdm.toml):
  20. python.path = D:\bigdata\miniconda3\python.EXE

6. 查看环境

使用pdm info可以查看当前具体环境:

  1. $ pdm info
  2. PDM version: 1.13.4
  3. Python Interpreter: D:\bigdata\miniconda3\python.EXE (3.9)
  4. Project Root: I:/Demos/pdm-demo
  5. Project Packages: I:\Demos\pdm-demo\__pypackages__\3.9
  6. $ pdm info --env
  7. {
  8. "implementation_name": "cpython",
  9. "implementation_version": "3.9.5",
  10. "os_name": "nt",
  11. "platform_machine": "AMD64",
  12. "platform_release": "10",
  13. "platform_system": "Windows",
  14. "platform_version": "10.0.22000",
  15. "python_full_version": "3.9.5",
  16. "platform_python_implementation": "CPython",
  17. "python_version": "3.9",
  18. "sys_platform": "win32"
  19. }

7. 切换Python版本

我们使用 PDM 初始化项目时,就已经指定了 Python 版本以及可用 Python 版本的范围,但如果想要切换其他可用版本,可以使用pdm use直接进行切换:

  1. $ pdm use py38

8. 运行程序

使用pdm run来运行程序,如果该程序的执行需要诸多参数,可在 pyproject.toml 中配置命令别名:

  1. $ pdm run python hello.py
  2. Hello, Python!

9. 设置命令别名

pyproject.toml 文件的[tool.pdm.scripts]部分添加快捷命令别名,这种形式在当前执行有非常多的参数时将会很有用。

回到上面运行程序的示例,如果在 pyproject.toml 文件可采取 2 种方式配置:

  • 第 1 种:

    1. [tool.pdm.scripts]
    2. start = "python hello.py"
  • 第 2 种:

    1. [tool.pdm.scripts]
    2. start = {cmd = "python hello.py"}

如果我们需要开启一个 Flask 服务,可以使用如下别名:

  1. [tool.pdm.scripts]
  2. start = {
  3. cmd = [
  4. "flask",
  5. "run",
  6. # Service Port
  7. "-p",
  8. "54321"]
  9. }

10. 自动补全

如果你使用的是 Zsh,可以将 pdm 插件配置到 .zshrc 文件中:

  1. plugins=(git z macos extract zsh-syntax-highlighting zsh-autosuggestions pdm)