探索 PDM:新一代的 Python 包管理工具

更多资料获取

📚 个人网站:ipengtao.com


PDM(Python Development Master)是一款新一代的 Python 包管理工具,旨在提供更为现代化、可靠且灵活的解决方案。与传统的 pip 和 Poetry 相比,PDM 在依赖版本管理、项目隔离和性能优化等方面展现出独特的优势。

PDM 强调了可靠性和稳定性,通过精细的依赖版本锁定机制,确保项目的可复现性。支持 PEP 582,PDM 将依赖包安装到项目目录,实现了更为灵活的项目级别依赖隔离。此外,PDM 使用本地缓存管理已下载的依赖,避免了重复下载,提高了依赖安装的效率。

在工作原理方面,PDM 通过虚拟环境隔离项目的依赖,并支持在项目目录下的 .pdm 文件夹中安装依赖,为项目提供了更加清晰和可维护的结构。

通过本文详细的介绍,可以更好地了解 PDM 的特性和优势,为其在实际项目中的应用提供指导。作为 Python 包管理领域的新秀,PDM 有望在未来成为开发者首选的工具之一,推动整个生态系统的进步。

PDM 的背景和动机

Python 包管理领域一直在不断演进,而PDM的诞生则是为了迎接新时代的挑战并提供更为现代化的解决方案。以下是PDM背景和动机的详细介绍:

1. 对现有包管理工具的反思

PDM的诞生并非偶然,而是对当前包管理工具存在的一系列问题和限制的深刻反思。例如,传统的pip在处理依赖关系和虚拟环境时可能显得不够灵活,而PDM正是为了解决这些问题而设计的。

2. 强调可靠性和稳定性

PDM注重可靠性和稳定性,旨在提供一个更加可靠的包管理环境。通过对各种边缘情况和实际项目的深入测试,PDM力求确保用户的依赖关系和项目环境的安全性。

3. 提升性能

性能一直是开发者关心的焦点之一。PDM通过优化依赖解析和安装过程,力求提供更快速的包管理体验。这种性能优化对于大型项目和持续集成环境尤为重要。

4. 更现代的依赖管理

PDM引入了更现代的依赖管理概念,允许精确地锁定依赖的版本,从而确保项目在不同环境中的可复现性。这种精确性是在协作开发和部署过程中尤为重要的。

5. 支持 PEP 582(PEP 581的改进版)

PDM的设计理念之一是支持 PEP 582,即通过本地缓存提高导入性能。这种支持有助于在开发过程中加速导入操作,提高项目整体的运行效率。

PDM 的安装与初始化

在这一部分,将学习如何安装 PDM 并初始化一个 Python 项目。以下是详细的步骤和示例代码:

1. 安装 PDM

首先,需要通过 pip 安装 PDM。打开你的命令行工具,运行以下命令:

pip install pdm

这将会下载并安装最新版本的 PDM 到你的 Python 环境中。

2. 初始化 Python 项目

一旦 PDM 安装完成,可以使用 pdm init 命令来初始化一个新的 Python 项目。这将会创建一个 pyproject.toml 文件,用于存储项目的配置信息。

pdm init

在初始化过程中,PDM 将询问一些基本的项目信息,例如项目名称、版本等。可以根据需要进行配置,或者直接按回车键使用默认值。

3. 示例代码

以下是一个简单的示例,演示了 PDM 的安装和初始化过程:

# 安装 PDM
pip install pdm

# 初始化 Python 项目
pdm init

安装完成后,将看到类似以下的输出:

Creating pyproject.toml...
PDM project has been successfully initialized!

至此,已成功安装 PDM 并初始化了一个 Python 项目。

依赖管理与虚拟环境

PDM 强调了灵活性和可定制性,使得依赖管理和虚拟环境的使用变得更为便捷。以下是一个详细的示例,演示如何在 PDM 中进行依赖管理和虚拟环境的操作。

1. 添加依赖

使用 pdm add 命令可以向项目中添加依赖。例如,要添加 requests 这个库作为项目的依赖:

pdm add requests

这会将 requests 添加到项目的 pyproject.toml 文件中,并触发 PDM 开始安装依赖。

2. 安装依赖

使用 pdm install 命令安装项目中的所有依赖:

pdm install

PDM 将会根据 pyproject.toml 中的配置信息,安装指定版本的依赖到虚拟环境中。

3. 查看依赖

通过 pdm list 命令,可以查看当前项目中已安装的依赖及其版本信息:

pdm list

4. 创建虚拟环境

PDM 使用虚拟环境来隔离项目的依赖。通过 pdm run 命令可以在虚拟环境中运行 Python 解释器,执行项目中的脚本:

pdm run python your_script.py

5. 示例代码

下面是一个整体的示例代码,演示了如何添加依赖、安装依赖、查看依赖和运行脚本:

# 添加依赖
pdm add requests

# 安装依赖
pdm install

# 查看依赖
pdm list

# 在虚拟环境中运行脚本
pdm run python your_script.py

通过以上步骤,成功地进行了依赖管理并创建了虚拟环境。这可以更加灵活地控制项目的依赖关系,确保项目的稳定性和可维护性。

锁定依赖版本

PDM 提供了强大的依赖版本控制机制,允许精确锁定依赖的确切版本,确保项目的可复现性。以下是一个详细的示例,演示如何在 PDM 中锁定依赖的版本。

1. 添加并锁定依赖版本

通过 pdm add 命令添加依赖,并通过 == 运算符指定确切的版本号,然后使用 pdm lock 命令锁定依赖的版本:

pdm add Flask==2.0.1
pdm lock

这会将 Flask 添加到项目的 pyproject.toml 文件中,并生成 pdm.lock 文件,其中包含确切的版本信息。

2. 查看锁定的依赖版本

通过 pdm list 命令,可以查看当前项目中已安装的依赖及其确切的版本信息:

pdm list

3. 示例代码

下面是一个完整的示例代码,演示了如何添加并锁定依赖版本:

# 添加依赖并锁定版本
pdm add Flask==2.0.1
pdm lock

# 查看已安装的依赖
pdm list

通过以上步骤,成功地添加了依赖并锁定了其确切版本,确保了项目的可复现性。这种精确的版本控制对于协作开发和在不同环境中部署项目至关重要。

PDM 的工作原理

深入了解 PDM 的工作原理有助于理解它是如何管理依赖、构建虚拟环境以及提供快速导入的。以下是 PDM 的工作原理以及对 PEP 582 的支持的详细解释,通过示例代码和图表来阐述这些概念。

1. 虚拟环境和依赖管理

PDM 通过虚拟环境来隔离项目的依赖。每个项目都有自己的虚拟环境,其中包含该项目所需的所有依赖包。这确保了项目之间的独立性,防止依赖冲突。

2. PEP 582 的支持

PDM 支持 PEP 582,这意味着它可以将依赖包安装到项目目录下的 .pdm 文件夹中,而不是全局安装。这种方式提高了项目的可移植性和一致性。

3. 本地缓存

PDM 使用本地缓存来存储已下载的依赖包。这个本地缓存位于项目目录下的 .pdm-cache 文件夹中。通过本地缓存,PDM 可以避免重复下载相同版本的依赖,提高了依赖安装的效率。

4. 示例代码

以下是一些示例代码,演示了 PDM 的工作原理:

# 创建虚拟环境并安装依赖
pdm install

# 查看本地缓存
ls .pdm-cache

# 查看虚拟环境
ls .pdm/venv

# 运行 Python 解释器,导入项目依赖
pdm run python -c "import requests"

通过以上代码,可以更好地理解 PDM 是如何通过虚拟环境、本地缓存以及对 PEP 582 的支持来管理项目的依赖和提供快速导入的。这些机制使得 PDM 在依赖管理和项目隔离方面表现出色。

与其他包管理工具的比较

PDM 作为新一代的 Python 包管理工具,与传统的 pip 和 Poetry 相比,具有一些独特的优势。以下是对比以及通过示例代码突出 PDM 的优势:

1. 依赖版本管理

PDM: PDM 提供了更精细的依赖版本管理机制,允许锁定确切的依赖版本,确保项目的可复现性。

pdm add requests==2.26.0
pdm lock

pip: pip 也支持版本锁定,但可能相对繁琐,需要手动编辑 requirements.txt 文件。

pip install requests==2.26.0

Poetry: Poetry 通过 poetry add 命令添加依赖,然后通过 poetry install 安装,但版本锁定的语法较为独特。

poetry add requests@2.26.0

2. PEP 582 的支持

PDM: PDM 支持 PEP 582,将依赖安装到项目目录下的 .pdm 文件夹中,实现了项目级别的依赖隔离。

ls .pdm/venv

pip: pip 安装依赖通常是全局的,需要额外的虚拟环境管理。

python -m venv venv
source venv/bin/activate
pip install requests

Poetry: Poetry 通过虚拟环境进行依赖隔离,但全局安装 Poetry 本身可能影响其他项目。

poetry install

3. 本地缓存

PDM: PDM 使用本地缓存管理已下载的依赖,避免重复下载,提高了依赖安装的效率。

ls .pdm-cache

pip: pip 也有缓存,但可能分散在用户目录下,不够集中。

ls ~/.cache/pip

Poetry: Poetry 也有缓存,位于用户目录下。

ls ~/.cache/pypoetry

总结

在本文中,深入探讨了 PDM 作为新一代 Python 包管理工具的各项特性。从安装与初始化、依赖管理、锁定版本,到工作原理和与其他工具的比较,详细介绍了 PDM 的优势。PDM 通过灵活的依赖版本管理、PEP 582 的支持以及本地缓存等机制,为开发者提供了更为可靠、高效的包管理体验。

相比于传统的 pip 和 Poetry,PDM 在依赖隔离、版本控制和性能优化等方面表现出色。通过示例代码和清晰的对比,读者可以更好地理解 PDM 的使用方法和其在实际项目中的优势。总体而言,PDM 在不断演进的 Python 生态中扮演着重要的角色,为开发者提供了更为现代、灵活的包管理解决方案。希望本文能够激发读者对 PDM 的兴趣,并在实际项目中体验其强大功能。


Python学习路线

在这里插入图片描述

更多资料获取

📚 个人网站:ipengtao.com

如果还想要领取更多更丰富的资料,可以点击文章下方名片,回复【优质资料】,即可获取 全方位学习资料包。

在这里插入图片描述
点击文章下方链接卡片,回复【优质资料】,可直接领取资料大礼包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/232119.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

点云 ros PointCloud2格式与livox CustomMsg格式介绍

点云 ros PointCloud2格式与livox CustomMsg格式介绍 PointCloud2 点云格式livox CustomMsg 点云格式 PointCloud2 点云格式 PointCloud2 是ros的一种点云格式 具体官方数据 http://docs.ros.org/en/jade/api/sensor_msgs/html/msg/PointCloud2.html std_msgs/Header header…

Qt/C++音视频开发57-切换音视频轨道/切换节目流/分别切换音频视频轨道

一、前言 对各种音视频文件格式的支持,是一个播放器的基础功能。一般的音视频文件只有1路流,比如音频文件只有1路音频流,视频文件只有1路音频1路视频流,实践过程中发现,还有一种ts格式的文件,可能有多路流…

基于SSM的成绩管理系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

qt:QMessageBox的常见用法

头文件&#xff1a;#include <QMessageBox> Infomation消息对话框 初始化格式&#xff1a; QMessageBox * msgBox new QMessageBox(QMessageBox::Information, "我是标题", "我是提示文字", 按钮); 按钮可以是以下取值&#xff0c;会在按键上显示…

C++中STL的容器vector

文章目录 什么是vectorvector与普通顺序表不同的点 vector的成员函数operatoroperator[]begin与end与iteratorsize()capacityresizeemptyreservepush_backpop_backinserteraseswapclear成员变量 总结 什么是vector vector&#xff1a;是数据结构里面的顺序表&#xff0c;开辟一…

JVM类加载器ClassLoader的源码分析

1、ClassLoader与现有类加载器的关系 ClassLoader与现有类加载器的关系&#xff1a; ClassLoader是一个抽象类。如果我们给定了一个类的二进制名称&#xff0c;类加载器应尝试去定位或生成构成定义类的数据。一种典型的策略是将给定的二进制名称转换为文件名&#xff0c;然后去…

LeetCode Hot100 39.组合总数

题目&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限…

[报错]记录IDEA远程开发报错:java: Cannot run program.....

报错内容 IDEA在进行远程开发的时候报错&#xff0c;内容如下&#xff1a; java: Cannot run program "/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java" (in directory "/home/jim/.cache/JetBrains/RemoteDev-IU/_home_jim_DevCodes_Github_zfile/compile-…

空中消防员:无人机森林防火应用全面升级

森林是生态系统的重要组成部分&#xff0c;也是人类得以生存的关键。我国森林面积广大&#xff0c;存在火灾频发的困境。提升森林火灾防控能力是维护生态平衡、保护资源和保障人民生命安全的必要步骤。随着无人机技术的发展&#xff0c;其在无人机森林防火中的应用为传统巡查工…

【EI会议征稿中】第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)

第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#xff09; 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 第二届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2023&…

SpringBoot中的YAML配置文件和日志

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 YAML配置文件1 基本语法2 语法细节 日志1 简介2 格式3 级别4 日志保存 &#x1f48e;总结 YAML配置文件 SpringBoot集中化管理配置&#xff1a;application.properties 问题&#xff1a;配置多了以后难阅读和修i该&…

链表OJ—相交链表

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 1、相交链表的题目&#xff1a; 方法讲解&#xff1a; 图文解析&#xff1a; 代码实现&#xff1a; 总结 前言 世上有两种耀眼的光芒&#xff0c;一种是正在升…

电脑中环境变量的设置方法

环境变量是在操作系统中一个具有特定名字的对象&#xff0c;它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量&#xff0c;当要求系统运行一个程序而没有告诉它程序所在的完整路径时&#xff0c;系统除了在当前目录下面寻找此程序外&a…

根据应聘者的姓名和所学专业判断是否需要这样的程序设计人员

一、程序分析 导入Scanner函数&#xff0c;分别输入应聘者的姓名和应聘者所学的程序设计语言。 二、具体代码 import java.util.Scanner; public class Recruitment {public static void main(String[] args){try (Scanner scan new Scanner(System.in)) {System.out.prin…

上位机与PLC:ModbusTCP通讯之数据类型转换

前请提要: 从PLC读取的数值,不管是读正负整数还是正负浮点数,读取过来后都会变成UInt16,也就是Ushort类型 一、ushort(UInt16)转成 Int32 源代码方法: //ushort类型转Int32类型的方法private int ushortToInt32(ushort[] date, int start){//先进行判断,长度是否正确…

矩阵处理—Zigzag矩阵打印

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 Zigzag矩阵打印1.1 题目描述1.2 解决思路1.3 代码实现 &#x1f48e;总结 Zigzag矩阵打印 1.1 题目描述 有一个n行m列的矩阵&#xff0c;要求按照Z字形打印出数据&#xff0c;如图&#xff1a; 1.2 解决思路 用一…

【JUC】二十三、LongAdder:多线程计数的更优解

文章目录 1、常用API2、热点商品点赞计算器3、LongAdder高性能的原理4、源码&#xff1a;LongAdder-add方法5、源码&#xff1a;LongAdder-longAccumulate方法6、源码&#xff1a;LongAdder-sum方法7、AtomicLong和LongAdder的对比 Since 1.8&#xff0c;新加原子操作增强类&am…

AI+HR黑科技秘笈:AI赋能人力资本智能化变革

今天分享的是AI系列深度研究报告&#xff1a;《AIHR黑科技秘笈&#xff1a;AI赋能人力资本智能化变革》。 &#xff08;报告出品方&#xff1a;Ifchange&#xff09; 报告共计&#xff1a;98页 让AI技术提升人岗匹配效果&#xff0c;我们做了这些探索 AI 技术实现人岗匹配&a…

DTCC2023大会-DBdoctor-基于eBPF观测数据库-附所有PPT下载链接

DTCC2023大会-DBdoctor-基于eBPF观测数据库-附所有PPT下载链接 8月16日—18日,第14届中国数据库技术大会(DTCC-2023)在北京国际会议中心举行。聚好看在大会上首次发布基于eBPF观测数据库性能的产品DBdoctor&#xff0c;受到了业界广泛的关注。近期几位业内同仁过来要大会的PPT…

滑动窗口练习(三)— 加油站问题

题目 测试链接 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数数组…