🚀 官方文档: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 pdminstalled package pdm 1.13.4, installed using Python 3.9.5These apps are now globally available- pdm.exedone! ✨ 🌟 ✨
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 richAdding packages to default dependencies: rich✔ 🔒 Lock successfulChanges 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 successfulInstalling the project as an editable package...✔ Update pdmtest 0.1.0 -> 0.1.0 successful🎉 All complete!
4.2 查看包
使用pdm list命令列出当前环境已经安装的包,该命令还有--graph和--json参数可以使用:
$ pdm listPackage Version Location------------------ --------- --------------------certifi 2021.10.8charset-normalizer 2.0.12commonmark 0.9.1idna 3.3pygments 2.11.2requests 2.27.1rich 12.0.0urllib3 1.26.9$ pdm list --graphpdmtest 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 requestsName: requestsLatest version: 2.27.1Latest stable version: 2.27.1Installed version: 2.27.1Summary: Python HTTP for Humans.Requires Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*Author: Kenneth ReitzAuthor email: me@kennethreitz.orgLicense: Apache 2.0Homepage: https://requests.readthedocs.ioProject URLs: Documentation: https://requests.readthedocs.ioSource: https://github.com/psf/requestsPlatform: UNKNOWNKeywords:
4.3 删除包
使用pdm remove来删除包
$ pdm remove requestsRemoving packages from default dependencies: requestsChanges are written to pyproject.toml.✔ 🔒 Lock successfulChanges 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 successfulInstalling 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 configHome configuration (C:\Users\yumingmin\.pdm\config.toml):auto_global = Falsebuild_isolation = Truecache_dir = C:\Users\yumingmin\AppData\Local\pdm\pdm\Cachecheck_update = Trueinstall.cache = Falseinstall.cache_method = symlinkinstall.parallel = Trueproject_max_depth = 5pypi.json_api = Falsepypi.url = https://pypi.douban.com/simple/pypi.verify_ssl = Truepython.use_pyenv = Truepython.use_venv = Falsestrategy.resolve_max_rounds = 10000strategy.save = minimumstrategy.update = reuseProject configuration (I:\Demos\pdm-demo\.pdm.toml):python.path = D:\bigdata\miniconda3\python.EXE
6. 查看环境
使用pdm info可以查看当前具体环境:
$ pdm infoPDM version: 1.13.4Python Interpreter: D:\bigdata\miniconda3\python.EXE (3.9)Project Root: I:/Demos/pdm-demoProject 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.pyHello, 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)
