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