AberSheeran
Aber Sheeran

PDM 使用精要

起笔自
所属文集: Python-Package
共计 2298 个字符
落笔于

PDM 是一个新的 Python 包管理工具,它的作者是 PyPa 成员、Pipenv 目前主要的维护者之一。在我许久的使用过程里,深觉这个工具比目前出现的任何其他 Python 包管理工具都好用。但是不能说它是 Python 界的 NPM,因为有些功能 NPM 都没有,唯一可惜的是没有被 Guido 钦定,不然可以说 NPM 是 node.js 的 PDM 了。

安装方式一如既往,只需要 pipx install pdm 就行。

PEP-582

PEP-582 是比较新的一个 PEP 规范,它约束了 Python 本地包存放的位置——__pypackages__。如果使用过 node.js 的人可能会更加明白一点,因为 __pypackages__ 就像是 Python 版本的 node_modules

而 PDM 默认情况下就是使用这一标准来存储、导入本地包。你只需要使用 pdm --pep582 就可以在 Windows 上直接让 Python 能直接从 __pypackages__ 寻找需要导入的包;在其他系统上则需要把 pdm --pep582 输出的结果追加到自己的 bashrc 里,我相信 Linux 用户都是能力出众的极客,所以不展开 bashrc 这种小事。

不过你需要注意,pdm --pep582 只能让 Python 执行时能够顺利的 import 到需要的包,但却不能让操作系统知道你需要用安装到 __pypackages__ 的可执行文件,故而哪怕你激活了 pdm --pep582,在运行一些命令时你仍然需要把 pdm run 加在命令之前来执行——就像 npm run 一样。

由于此规范太过于新,所以各编辑器并没有自带支持,你需要按照 pdm 文档 里的方式去配置。

此外,这并不是本文的重点,如果你有兴趣了解更深,可以看 PDM 作者本人的相关博客——PEP 582 的开发日志(续)

pdm init

按照传统,还是初始化配置,跟着交互式命令输入即可。

如果你是从 poetry 迁移过来的,那么在最后一步 PDM 会问你是不是要从 Python-Poetry 导入信息,可以一键格式转化。这个功能虽然还是有一点瑕疵,有几个字段转换不太正常(不知道现在修了没)不过无伤大雅,重要信息都无损的转换到 pdm 所需的格式了。

pdm add && remove

基本用法与其他管理工具相同,pdm add index.py 这种格式就可以安装一个 Python 包了,移除同理。

但 pdm 别出心裁地增加了一个非常好用的功能——分组。以 baize 为例,包必须的依赖自然不必多说,开发时的依赖则非常多,而诸如编译所需的包、构建文档所需的包在正常开发里其实又用不到。

如果你用的是 poetry 那就没办法了,你只能 poetry add package_name --dev 统一划分到开发以来里。而 PDM 允许你使用 pdm add -dG docs package_name 这样的选项在开发依赖里分组,比如 -G docs 是指分到 docs 组,也就是构建文档所需地依赖。

poetry add --dev 这样加进去的开发依赖,可以用 package_name[dev] 来安装,真正的安装时可选依赖你却只能手动修改 pyproject.toml 来划分。而 PDM 做到了真正的开发依赖隔离,构建出来的包是不会携带任何通过 pdm add -d 命令加进去的依赖的。而你如果需要指定一些安装时可选的依赖包,只需要用 pdm add -G group_name 命令去添加依赖。

从使用体验来讲,分组功能是我选择 PDM 最重要的原因之一。

pdm install && update

基本用法也和其他管理工具相同。这两个命令也都支持 -G 命令用以安装、更新指定分组内指定的依赖。

pdm run

如果你没有开启 pdm --pep582 却又想让你的 Python 代码能正确地找到你安装的包,或是想要执行一个第三方包携带的可执行文件,那么你就得把 pdm run 加在你每一个在项目里执行的命令的前面。

除此之外,PDM 还允许你自己包装一些命令,就像 npm run 一样。

# pyproject.toml

[tool.pdm.scripts]
_.env_file = ".env" # 注意这一行配置的意思是解析 `.env` 文件的内容加进各命令执行时的环境变量
serve = "index-cli uvicorn main:app"
migrate = "python -m shoucang migrate main"

pdm export

Python-Poetry 最让人诟病的一点就是一开始没有 export 命令,后面妥协了却又只有 requirements.txt 格式的,搞得我自己写了一个 poetry2setup 来用。

PDM 则自带种种格式导出,随时可以一键跑路😀。

配置 PyPi 地址

对于中国用户来说,这个功能可以说是必不可缺的。PDM 作为一个中国人开发的工具自然也包含这个功能,而且使用起来相较于 Pipenv 和 Python-Poetry 更加方便。

pdm config pypi.url https://pypi.tuna.tsinghua.edu.cn/simple
如果你觉得本文值得,不妨赏杯茶
ContextVars 详解
asyncio 与 kafka