Python包管理工具之 PDM

简介: 大家好,我是小姜。之前讲了一个pipenv和poetry包管理工具,想必大家也和我一样去了解过pipenv所存在问题,所以不是很推荐使用。后来改成了poetry工具,但这个东西对我来说稍微有点麻烦,经常容易打错,虽然可以做成alias的形式。那么今天我给大家推荐一个叫PDM的工具,全称:Python Development Master。它也是非常好用,有兴趣的朋友可以使用一下。

安装使用PDM


# macos安装pipx
brew install pipx
pipx ensurepath
# Linux安装pipx
python3 -m pip install pipx
python3 -m pipx ensurepath


用pipx安装pdm


PDM 只有 Python 3.7+ 的版本才能使用,使用其他的方法安装,要先保证你的 Python 版本,但使用 pipx 则不需要你去操心。一定要注意安装pipx的版本以及pipx安装pdm时使用的Python版本,否则 pdm init 会失败


pipx install pdm
pipx list


配置 pdm 自动补全


# zsh方法
mkdir $ZSH_CUSTOM/plugins/pdm
pdm completion zsh > $ZSH_CUSTOM/plugins/pdm/_pdm
vim ~/.zshrc
plugins=(
         pdm
         poetry
         git
         zsh-completions
         zsh-autosuggestions
)
source ~/.zshrc
pdm info


PDM初始化项目


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

  • 是否要上传 PyPI
  • 依赖的 Python 版本
  • License 类型
  • 作者信息
  • 邮箱信息 在初始化项目时会把机器上的所有 Python 版本都扫描出来了,会让选择项目的 Python 版本。


❯ mkdir pdm-demo
❯ cd pdm-demo
# 重新执行pdm成功
❯ pdm init
Creating a pyproject.toml for PDM...
Please enter the Python interpreter to use
0. /Users/allenjol/.pyenv/versions/3.10.4/bin/python3 (3.10)
1. /Users/allenjol/.pyenv/versions/3.10.4/bin/python (3.10)
2. /Users/allenjol/.pyenv/versions/3.10.4/bin/python3.10 (3.10)
3. /Users/allenjol/.pyenv/versions/3.10.4/bin/python3.10 (3.10)
4. /Users/allenjol/.pyenv/versions/3.10.4/bin/python3 (3.10)
5. /Users/allenjol/.pyenv/versions/3.10.4/bin/python (3.10)
6. /Library/Frameworks/Python.framework/Versions/Current/bin/python3.10 (3.10)
7. /Library/Developer/CommandLineTools/usr/bin/python3 (3.8)
8. /Users/allenjol/.local/pipx/venvs/pdm/bin/python (3.10)
Please select: [0]: 8
Using Python interpreter: /Users/allenjol/.local/pipx/venvs/pdm/bin/python (3.10)
Is the project a library that will be uploaded to PyPI? [y/N]: N
License(SPDX name) [MIT]:
Author name [allen_jol]:
Author email [471733951@qq.com]:
Python requires('*' to allow any) [>=3.10]:
Changes are written to pyproject.toml.
# 完成之后,PDM 会将你的选择以 toml 格式写入 pyproject.toml 配置文件中。
❯ ll
total 8
-rw-r--r--  1 allenjol  staff  283 May 20 13:58 pyproject.toml
❯ cat pyproject.toml
[project]
name = ""
version = ""
description = ""
authors = [
    {name = "allen_jol", email = "471733951@qq.com"},
]
dependencies = []
requires-python = ">=3.10"
license = {text = "MIT"}
[tool.pdm]
[build-system]
requires = ["pdm-pep517>=0.12.0"]
build-backend = "pdm.pep517.api"


PDM 常用命令


# 安装包
pdm add requests
# 查看包
pdm list
# 以树状形式查看
pdm list --graph
# 查看包的详情
pdm show requests
# 删除包
pdm remove requests
# 项目配置(不加任何参数,可以打印出该项目的环境配置)
pdm config
# 修改pypi源
pdm config pypi.url http://mirrors.aliyun.com/pypi/simple
pdm config pypi.url


运行命令


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


$ cat main.py
print('Hello, pdm')
$ pdm run python main.py
hello, pdm


查看环境


pdm info -v
pdm info --env
pdm info --packages
pdm info --where
pdm info --python


更新包


# 更新所有包
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 文件,但不更新包


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


pdm update -G security -G http


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


pdm update -G security cryptography


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


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


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


切换Python版本


当你在初始化 pdm 项目时,就已经选定了当前的 Python 版本和可用的 Python 版本范围,后面如果想更改,可以使用 use 命令,但版本要受之前设定的版本范围约束。假设允许范围是 python 3.9+,当前使用的是 python 3.10,可以直接切换过去。


pdm use python3.9


命令别名


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


$ tail -n 2 pyproject.toml
[tool.pdm.scripts]
start = 'python main.py'
$ pdm run start
Running cmd script: ['python', 'main.py']
Hello, pdm


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


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


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


[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 差不多一个意思


$ tail -n 2 pyproject.toml
[tool.pdm.scripts]
start = {shell = "python main.py"}
$ pdm run start
Running cmd script: python main.py
Hello, pdm


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


[tool.pdm.scripts]
start.cmd = "flask run -p 54321"
start.env_file = ".env"


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


[tool.pdm.scripts]
_.env_file = ".env"


方案兼容


其他方案迁移到pdm


pdm 足够好用,也足够开放,如果你当前使用的是其他的包管理器,比如 pipenv ,

poetry,或者还在用最原始的 requirements.txt ,你也可以很方便的迁移到 pdm 中来:


  • 使用 pdm import -f 无需初始化,直接转换


  • 执行 pdm init 或者 pdm install 的时候,会自动识别你当前的依赖情况并转换 pdm迁移到其他方案 也可以当 pdm 管理的项目,导出为其他方案 pyproject.toml 和 pdm.lock是 pdm 的两个核心文件。pdm 做为一个后起之秀,也没有忘本,它支持:


将 pyproject.toml 转成 setup.py


pdm export -f setuppy -o setup.py


将 pdm.lock 转成 requirements.txt


pdm export -o requirements.txt


pycharm 配置支持 PDM


在命令行创建项目目录,进入项目目录执行init初始化,设置一下pypi源,然后使用pycharm打开这个目录。


mkdir pdm-demo
cd pdm-demo
pdm config pypi.url
pdm config pypi.url http://mirrors.aliyun.com/pypi/simple –-trusted-host mirrors.aliyun.com
pdm config pypi.url
# 永久设置 Linux下
❯ vi ~/.pip/pip.conf
[global]
index-url=https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
# 使用 pdm 安装一个包:
pdm add -v requests flask


完成安装后,我们可以在当前目录下看到__pypackages_目录,我们前面所安装的库就隔离安装在其下面,类似node的node_modules目录。这样就实现了项目级别的环境隔离效果,且无需创建额外的虚拟环境,要在IDE中使用pdm项目下的本地隔离库执行程序很简单,以pycharm为例,将pdm项目打开为pycharm工程之后,找到如图所示位置的lib文件夹,将其标记为Sources Root即可,同时记得将解释器选为pdm init初始化时所在环境相对应的。


用pycharm打开pdm-demo项目,找到如图所示位置的lib文件夹,将其标记为Sources Root即可,同时记得将解释器选为pdm init初始化时所在环境相对应的Python解释器。

pycharm设置Python解释器为pdm init初始化时所在环境相对应的Python解释器:先查看 pdm info 信息,可以看到 Python Interpreter 解释器路径


❯ pdm info
PDM version:        1.15.0
Python Interpreter: /Users/allenjol/.local/pipx/venvs/pdm/bin/python (3.10)
Project Root:       /Users/allenjol/Documents/Codes/pdm-demo
Project Packages:   /Users/allenjol/Documents/Codes/pdm-demo/__pypackages__/3.10


pycharm设置 Python Interpreter 路径和pdm info 出来的一样即可。

关于PDM的使用介绍到这里就结束了,看完后是不是觉得它很强大,也很有用。赶紧去试试吧!

相关文章
|
14天前
|
存储 数据可视化 Python
使用Python实现个人财务管理工具
本文介绍如何使用Python实现一个简单的个人财务管理工具,包括记录支出和收入、生成财务报告和数据可视化等功能。通过命令行界面输入数据,计算总支出、总收入和净收入,并使用Matplotlib库进行数据可视化。
|
18天前
|
数据采集 数据可视化 数据挖掘
R语言与Python:比较两种数据分析工具
R语言和Python是目前最流行的两种数据分析工具。本文将对这两种工具进行比较,包括它们的历史、特点、应用场景、社区支持、学习资源、性能等方面,以帮助读者更好地了解和选择适合自己的数据分析工具。
22 2
|
18天前
|
C语言 开发者 Python
探索Python中的列表推导式:简洁而强大的工具
【10月更文挑战第21天】在Python的世界里,代码的优雅与效率同样重要。列表推导式(List Comprehensions)作为一种强大而简洁的工具,允许开发者通过一行代码完成对列表的复杂操作。本文将深入探讨列表推导式的使用方法、性能考量以及它如何提升代码的可读性和效率。
|
28天前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
42 2
|
1月前
|
测试技术 Python
Python MagicMock: Mock 变量的强大工具
Python MagicMock: Mock 变量的强大工具
|
1月前
|
存储 Python
python数据类型、debug工具(一)
python数据类型、debug工具(一)
|
15天前
|
C语言 Python
探索Python中的列表推导式:简洁而强大的工具
【10月更文挑战第24天】在Python编程的世界中,追求代码的简洁性和可读性是永恒的主题。列表推导式(List Comprehensions)作为Python语言的一个特色功能,提供了一种优雅且高效的方法来创建和处理列表。本文将深入探讨列表推导式的使用场景、语法结构以及如何通过它简化日常编程任务。
|
1月前
|
网络协议 IDE iOS开发
Python编程---简单的聊天工具
Python编程---简单的聊天工具
|
1月前
|
数据处理 开发者 Python
Python编程中的列表推导式:简洁而强大的工具
【9月更文挑战第35天】在Python的众多特性中,列表推导式以其简明扼要和强大功能脱颖而出。本文不仅将介绍列表推导式的基础知识,还将探讨其背后的逻辑,并辅以实际代码示例。无论你是初学者还是有经验的开发者,都能从中获取新的见解和应用技巧。
26 5
|
2月前
|
测试技术 Python
Python MagicMock: Mock 变量的强大工具
Python MagicMock: Mock 变量的强大工具