🚀 官方文档:https://pdm.fming.dev/ 🚀 GitHub 地址:https://github.com/pdm-project/pdm 🚀 原作博客:https://frostming.com/2020/02-28/pdm-introduction/ 🚀 参考文档:
说到 Python 的包管理,我们第一时间想到的是pip
、conda
这些常用工具,如果是玩工程比较多的同学,像Pipenv
、Poetry
这些包管理工具应该也不会陌生。这些包管理器都是基于虚拟环境的,而虚拟环境的主要目的就是为了隔离项目开发环境,但如果涉及到虚拟环境中继续嵌套虚拟环境,这些包就无法达到期望的效果。
下面我们介绍一款新的包管理工具——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
方式进行安装。
$ pip install --user pipx
$ pipx ensurepath
$ pipx install pdm
installed package pdm 1.13.4, installed using Python 3.9.5
These apps are now globally available
- pdm.exe
done! ✨ 🌟 ✨
3. 初始化PDM
执行pdm init
命令就会开始初始化,初始化的时候,会让我们选择项目的一些信息:
- 是否需要上传 PyPI
- 项目名称
- 项目版本信息
- License 类型
- 作者信息
- 邮箱信息
- 依赖的 Python 版本
完成初始化之后,PDM 会将我们的选择以 toml 格式写入 pyproject.toml 配置文件中,并且还会生成一个 .pdm.toml 文件:
[project]
name = "pdmtest"
version = "0.1.0"
description = ""
authors = [
{name = "yumingmin", email = "yumingmin@xinye.com"},
]
license-expression = "MIT"
dependencies = []
requires-python = ">=3.9"
[project.urls]
Homepage = ""
[tool.pdm]
[build-system]
requires = ["pdm-pep517>=0.12.0"]
build-backend = "pdm.pep517.api"
4. 基础用法
4.1 安装包
和 Poetry 一样,安装第三方库使用add
命令,但pdm
会比poetry
好用,主要体现子分组上:
$ pdm add rich
Adding packages to default dependencies: rich
✔ 🔒 Lock successful
Changes are written to pdm.lock.
Changes are written to pyproject.toml.
⠹ Resolving packages from lockfile...
Synchronizing working set with lock file: 3 to add, 0 to update, 0 to remove
✔ Install commonmark 0.9.1 successful
✔ Install pygments 2.11.2 successful
✔ Install rich 12.0.0 successful
Installing the project as an editable package...
✔ Update pdmtest 0.1.0 -> 0.1.0 successful
🎉 All complete!
4.2 查看包
使用pdm list
命令列出当前环境已经安装的包,该命令还有--graph
和--json
参数可以使用:
$ pdm list
Package Version Location
------------------ --------- --------------------
certifi 2021.10.8
charset-normalizer 2.0.12
commonmark 0.9.1
idna 3.3
pygments 2.11.2
requests 2.27.1
rich 12.0.0
urllib3 1.26.9
$ pdm list --graph
pdmtest 0.1.0 [ required: This project ]
├── requests 2.27.1 [ required: >=2.27.1 ]
│ ├── certifi 2021.10.8 [ required: >=2017.4.17 ]
│ ├── charset-normalizer 2.0.12 [ required: ~=2.0.0 ]
│ ├── idna 3.3 [ required: <4,>=2.5 ]
│ └── urllib3 1.26.9 [ required: <1.27,>=1.21.1 ]
└── rich 12.0.0 [ required: >=12.0.0 ]
├── commonmark 0.9.1 [ required: <0.10.0,>=0.9.0 ]
└── pygments 2.11.2 [ required: <3.0.0,>=2.6.0 ]
如果需要查看某个包的具体详情,可以使用pdm show
命令:
$ pdm show requests
Name: requests
Latest version: 2.27.1
Latest stable version: 2.27.1
Installed version: 2.27.1
Summary: Python HTTP for Humans.
Requires Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*
Author: Kenneth Reitz
Author email: me@kennethreitz.org
License: Apache 2.0
Homepage: https://requests.readthedocs.io
Project URLs: Documentation: https://requests.readthedocs.io
Source: https://github.com/psf/requests
Platform: UNKNOWN
Keywords:
4.3 删除包
使用pdm remove
来删除包
$ pdm remove requests
Removing packages from default dependencies: requests
Changes are written to pyproject.toml.
✔ 🔒 Lock successful
Changes are written to pdm.lock.
⠹ Resolving packages from lockfile...
Synchronizing working set with lock file: 0 to add, 0 to update, 5 to remove
✔ Remove certifi 2021.10.8 successful
✔ Remove idna 3.3 successful
✔ Remove charset-normalizer 2.0.12 successful
✔ Remove urllib3 1.26.9 successful
✔ Remove requests 2.27.1 successful
Installing the project as an editable package...
✔ Update pdmtest 0.1.0 -> 0.1.0 successful
🎉 All complete!
4.4 更新包
使用pdm update
来更新全部包,或者使用pdm update <pkg>
来更新指定包:
$ pdm update
$ pdm update requests
5. 项目配置
终端中执行pdm config
即可打印 PDM 配置以及项目配置,当然,我们可以不使用全局配置,可在项目下 .pdm.toml 文件中添加指定参数和值:
$ pdm config
Home configuration (C:\Users\yumingmin\.pdm\config.toml):
auto_global = False
build_isolation = True
cache_dir = C:\Users\yumingmin\AppData\Local\pdm\pdm\Cache
check_update = True
install.cache = False
install.cache_method = symlink
install.parallel = True
project_max_depth = 5
pypi.json_api = False
pypi.url = https://pypi.douban.com/simple/
pypi.verify_ssl = True
python.use_pyenv = True
python.use_venv = False
strategy.resolve_max_rounds = 10000
strategy.save = minimum
strategy.update = reuse
Project configuration (I:\Demos\pdm-demo\.pdm.toml):
python.path = D:\bigdata\miniconda3\python.EXE
6. 查看环境
使用pdm info
可以查看当前具体环境:
$ pdm info
PDM version: 1.13.4
Python Interpreter: D:\bigdata\miniconda3\python.EXE (3.9)
Project Root: I:/Demos/pdm-demo
Project Packages: I:\Demos\pdm-demo\__pypackages__\3.9
$ pdm info --env
{
"implementation_name": "cpython",
"implementation_version": "3.9.5",
"os_name": "nt",
"platform_machine": "AMD64",
"platform_release": "10",
"platform_system": "Windows",
"platform_version": "10.0.22000",
"python_full_version": "3.9.5",
"platform_python_implementation": "CPython",
"python_version": "3.9",
"sys_platform": "win32"
}
7. 切换Python版本
我们使用 PDM 初始化项目时,就已经指定了 Python 版本以及可用 Python 版本的范围,但如果想要切换其他可用版本,可以使用pdm use
直接进行切换:
$ pdm use py38
8. 运行程序
使用pdm run
来运行程序,如果该程序的执行需要诸多参数,可在 pyproject.toml 中配置命令别名:
$ pdm run python hello.py
Hello, Python!
9. 设置命令别名
在 pyproject.toml 文件的[tool.pdm.scripts]
部分添加快捷命令别名,这种形式在当前执行有非常多的参数时将会很有用。
回到上面运行程序的示例,如果在 pyproject.toml 文件可采取 2 种方式配置:
第 1 种:
[tool.pdm.scripts]
start = "python hello.py"
第 2 种:
[tool.pdm.scripts]
start = {cmd = "python hello.py"}
如果我们需要开启一个 Flask 服务,可以使用如下别名:
[tool.pdm.scripts]
start = {
cmd = [
"flask",
"run",
# Service Port
"-p",
"54321"]
}
10. 自动补全
如果你使用的是 Zsh,可以将 pdm 插件配置到 .zshrc 文件中:
plugins=(git z macos extract zsh-syntax-highlighting zsh-autosuggestions pdm)