来了!新一代的 Python 包管理工具 -- PDM

PDM 是一个新的 Python 的包管理器,也许你还未知晓它的存在,但实际上PDM 已经诞生两年,并在 2021 年发布 1.0 版本,目前最高的版本是 1.12.8。

在刚听到 PDM 时,我下意识认为它是 Python Development Manager,又一个和 Pipenv 和 Poetry 一样换汤不换药的虚拟环境管理工具。

一直到我翻到了作者的博客,才知道 PDM 的全称是 Python Development Master,比我想像的还要牛逼一个档次。

值得一提的是,PDM 的作者是 PyPa 成员、Pipenv 目前主要的维护者之一,最重要的是,他是中国人,因此这是一款国人开发的工具。

# 1. Why PDM?

早期的包管理器(如 Pipevn,Poetry),都是基于虚拟环境的,虚拟环境主要是为了隔离项目开发环境,但如果涉及到虚拟 环境嵌套虚拟环境,问题就难搞了,经常会出现问题。

PDM 得益于一个 2018 年的 PEP 提案(PEP582,Python local packages directory),完全摒弃了虚拟环境。

从作者的博客上来看,当初之所以要重复造个轮子,完全是因为 Pipenv 和 Poetry 都不够好用,正好有 PEP582 ,可以开发一个划时代的 Python 包管理工具,它就是 PDM 。

PDM 包含如下特性:

  • PEP 582 本地项目库目录,支持安装与运行命令,完全不需要虚拟环境。
  • 一个简单且相对快速的依赖解析器,特别是对于大的二进制包发布。
  • 兼容 PEP 517 的构建后端,用于构建发布包(源码格式与 wheel 格式)
  • 拥有灵活且强大的插件系统(有插件系统直接就拉开一个档次)
  • PEP 621 元数据格式
  • 像 pnpm 一样的中心化安装缓存,节省磁盘空间

尽管 PDM 是国人开发,但考虑到国际化,官网文档是全英文的。

我花了整整一天,通读完文档,消化了 70% 的 PDM 用法,现将心得整理分享出来,会对你上手 PDM 有帮助。

关于 PDM,内容挺多的,打算分两部分文章来完整地介绍它:

  • 面向新手的入门级教程
  • 面向骨灰级选手的教程

本篇是第一篇,先让大家对 pdm 的基本用法有一个框架性的理解,而 pdm 真正竞争力请持续关注后续文章。

# 2. 安装 PDM

PDM 的安装方法有很多种,在官网上就有 6 种,比如 pip、pipx、homebrew 等

在以前的文章中,我推荐过 pipx 工具,在安装那种命令行应用的包时非常好用。

详情:使用 pipx 工具安装命令行工具

而此时 PDM 就是一个命令行工具,因此我也推荐使用 pipx 安装,方便统一对命令行进行管理

执行 pipx install pdm 即可安装

图片

PDM 只有 Python 3.7+ 的版本才能使用,使用其他的方法安装,要先保证你的 Python 版本,但使用 pipx 则不需要你去操心。

# 3. 初始化 PDM

执行 pdm init 就会开始初始化,初始化的时候,会让你选择项目的一些信息

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

我机器上有 Python 2.7 和 Python 3.10 两个版本,在初始化项目时会把机器上的所有 Python 版本都扫描出来了,会让选择项目的 Python 版本。

图片

完成之后,PDM 会将你的选择以 toml 格式写入 pyproject.toml 配置文件中。

图片

# 4. PDM 用法

pdm 有非常多的命令,使用 -h 可以看到帮助菜单

图片

4.1 安装包

和 Poetry 一样,安装使用的是 add 命令,但 pdm 的 add 比 poetry 好用,主要体现在分组,具体请关注后续文章

图片

4.2 查看包

使用 pdm list 可以以列表形式列出当前环境已安装的包

图片

再加个 --graph 就能以树状形式查看,直接依赖包和间接依赖包关系的层级一目了然

图片

pdm list 还有两个选项:

  • –freeze:以 requirements.txt 的格式列出已安装的包
  • –json:以 json 的格式列出已安装的包,但必须与 --graph 同时使用

要查看某个包的某体详情,直接用 pdm show 即可

图片

4.3 删除包

删除包使用的是 remove 命令

图片

4.4 项目配置

不加任何参数,可以打印出该项目的环境配置

图片

想要修改的话,只要加 key 和 value 做为参数即可,以修改 pypi 镜像代理为例

原来上面是豆瓣源,现在我要改成阿里源,只需要执行如下命令,可比 poetry 方便多啦~

图片

pdm config 里面有非常多的配置,想要一一搞清楚的可以去官网查阅:pdm.fming.dev/configurati…

4.5 运行命令

想要在 pdm 的环境中执行命令或者项目,可以使用 run 命令,若是执行项目时,有诸多参数,可以在 pyproject.toml 配置命令别名,具体用法,请往后看

图片

4.6 查看环境

使用 info 命令,可以查看当前项目的环境信息

图片

4.7 更新包

更新的话,简单的场景下,使用下面这两条即可

bash
复制代码
# 更新所有包
pdm update 

# 更新某个包
pdm update <pkg>

复杂的场景,pdm 也都为你考虑到了,它提供了很多选项,可以根据需要使用(以下如有解释错误,请帮忙指正)

  • –save-compatible:项目依赖可兼容的版本
  • –save-wildcard:保存通配符版本(暂不明白)
  • –save-exact:保存有指定确切版本的包
  • –save-minimum:保持最小版本的包
  • –update-reuse:尽量只更新命令行中指定的包,其依赖包能不更新则不更新
  • –update-eager:更新某个包顺带更新其依赖包(递归升级)
  • –prerelease:允许提前释放(暂不明白)
  • –unconstrained:忽略包版本的约束,可将包升级至最新版本
  • –top:仅更新有在 pyproject.toml 的包
  • –dry-run:试运行,而不去修改 lock 文件
  • –no-sync:只更新 lock 文件,但不更新包

如果你的依赖包有设置分组,还可以指定分组进行更新

sql
复制代码
pdm update -G security -G http

也可以指定分组更新分组里的某个包

sql
复制代码
pdm update -G security cryptography

再加个 -d 就可以再指定 dev 依赖

bash
复制代码
# 更新所有的 dev 依赖
pdm update -d

# 更新 dev 依赖下某个分组的某个包
pdm update -dG test pytest

同样地,也可以指定 --prod 或者 --production 升级非 dev (即生产)的包。

4.8 切换 py

当你在初始化 pdm 项目时,就已经选定了当前的 Python 版本和可用的 Python 版本范围,后面如果想更改,可以使用 use 命令,但版本要受之前设定的版本范围约束。

假设允许范围是 python 3.9+,当前使用的是 python 3.10,可以直接切换过去。

perl
复制代码
pdm use python3.9

# 5. 命令别名

在 pyproject.toml 添加 [tool.pdm.scripts] 可以设置快捷命令别名,若项目的执行有非常多的参数,这种设定别名的方法将很有用。

图片

[tool.pdm.scripts] 有两种形式

ini
复制代码
# 第一种
[tool.pdm.scripts]
start = "python main.py"

# 第一种
[tool.pdm.scripts]
start = {cmd = "python main.py"}

但若想在参数中加注释,就必须得使用第二种方法,例如这样

ini
复制代码
[tool.pdm.scripts]
start = {cmd = [
    "flask",
    "run",
    # Important comment here about always using port 54321
    "-p", "54321"
]}

除了 cmd 之外,还有两个参数

一个是 shell 参数,从输出来看你应该和看出和 cmd 的区别,和 subprocess.Popen() with shell=True 差不多一个意思

图片

一个是 env_file 参数,可以指定配置环境变量的文件

ini
复制代码
[tool.pdm.scripts]
start.cmd = "flask run -p 54321"
start.env_file = ".env"

如果想要把这个环境变量的文件不仅限于某个命令,而是 pdm run 全局,可以这样配置

ini
复制代码
[tool.pdm.scripts]
_.env_file = ".env"

--list 或者 -l可以查看所有设置的快捷别名

图片

对于每一个快捷命令,都可以设置 pre 和 post 命令:

  • pre 命令:在每次快捷命令执行前会执行
  • post 命令:在每次快捷命令执行后会执行
ini
复制代码
[tool.pdm.scripts]
pre_compress = "{{ Run BEFORE the `compress` script }}"
compress = "tar czvf compressed.tar.gz data/"
post_compress = "{{ Run AFTER the `compress` script }}"

# 6. 自动补全

pdm 的命令虽多,但并不复杂,并不太需要使用自动补全,若你真的需要补全,也可以实现。

对于不同的 shell,自动补全的配置方式都不太一样,这个在官网上有详细的说明。

如果你和我一样使用的 zsh,可以参照我的配置方式。

图片

截图中间有一步是 vim ~/.zshrc ,是将 pdm 插件配置到 zsh 中

ini
复制代码
plugins=(git z macos extract zsh-syntax-highlighting zsh-autosuggestions pdm)

# 7. 方案兼容

其他方案迁移到 pdm

pdm 足够好用,也足够开放,如果你当前使用的是其他的包管理器,比如 pipenv ,poetry,或者还在用最原始的 requirements.txt ,你也可以很方便的迁移到 pdm 中来:

  • 使用 pdm import -f {file} 无需初始化,直接转换
  • 执行 pdm init 或者 pdm install 的时候,会自动识别你当前的依赖情况并转换

pdm 迁移到其他方案

同样的,你也可以当 pdm 管理的项目,导出为其他方案

pyproject.toml 和 pdm.lock是 pdm 的两个核心文件。

pdm 做为一个后起之秀,也没有忘本,它支持:

  • 将 pyproject.toml 转成 setup.py

    arduino
    复制代码
    pdm export -f setuppy -o setup.py
    
  • 将 pdm.lock 转成 requirements.txt

    arduino
    复制代码
    pdm export -o requirements.txt
    

# 8. 总结一下

花了很大的力气,终于把 PDM 的基本用法给介绍完毕,相信一定会有人会提出质疑:这就是你所谓的 划时代的包管理器

实际上,上面仅仅是入门操作,而 PDM 的一些核心知识,考虑到篇幅有限,我将这些进阶类的内容安排在后续文章,它将包括但不仅限于:

  • PDM 的原理剖析:PEP 582 提案
  • 发布包的构建:PEP 517 提案
  • Hook 脚本的定义与使用
  • 插件管理系统与自定义插件
  • 缓存管理系统的介绍

这些内容是 PDM 的核心,只有理解了这些,你才能真正用好 PDM,到那时你会感慨:为什么 Guido 还不把这样的工具收编成标准的包管理工具?

题外话

在此疾速成长的科技元年,编程就像是许多人通往无限可能世界的门票。而在编程语言的明星阵容中,Python就像是那位独领风 骚的超级巨星, 以其简洁易懂的语法和强大的功能,脱颖而出,成为全球最炙手可热的编程语言之一。


Python 的迅速崛起对整个行业来说都是极其有利的 ,但“人红是非多”,导致它平添了许许多多的批评,不过依旧挡不住它火爆的发展势头。

如果你对Python感兴趣,想要学习pyhton,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

👉CSDN大礼包🎁:全网最全《Python学习资料》免费分享(安全链接,放心点击)👈

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

5️⃣Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值