Python依赖管理Pipfile与Pipfile.lock使用及说明

 更新时间:2025年12月29日 16:33:43   作者:nvd11  
本文详细介绍了Python项目中Pipfile和Pipfile.lock的作用、原理,以及它们与传统requirements.txt的区别,Pipfile和Pipfile.lock是Pipenv的核心组件,用于解决依赖管理中的版本冲突、开发依赖分离困难、环境一致性差等问题

本文档详细介绍了 Python 项目中 PipfilePipfile.lock 的作用、原理,以及它们与传统 requirements.txt 的区别。

1. 它们是什么?

这两个文件是 Python 依赖管理工具 Pipenv 的核心组件。

如果你熟悉前端开发(Node.js),可以这样类比:

  • Pipfile ≈ \approx package.json
  • Pipfile.lock ≈ \approx package-lock.jsonyarn.lock

它们的设计目的是为了解决 Python 传统依赖管理(pip + requirements.txt)中的一些痛点,如版本冲突、开发依赖分离困难、环境一致性差等。

2. 文件详解

2.1 Pipfile (给人看的)

这是一个 TOML 格式的文件,用来声明项目需要哪些包。它只记录你直接安装的顶层依赖。

主要特点:

  • 易读性:结构清晰。
  • 环境分离:明确区分 [packages](生产环境)和 [dev-packages](开发测试环境)。
  • 版本灵活:通常只指定最低版本或模糊版本(如 *),表明意图。
  • Python 版本指定:可以锁定项目所需的 Python 解释器版本。

示例 Pipfile:

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
requests = "*"          # 安装最新版
fastapi = ">=0.68.0"    # 指定最低版本

[dev-packages]
pytest = "*"
black = "*"

[requires]
python_version = "3.10"

2.2 Pipfile.lock (给机器看的)

这是一个自动生成的 JSON 文件,绝对不应该手动修改

主要特点:

  • 确定性构建 (Deterministic Builds):它通过运行 pipenv lock 生成,将 Pipfile 中模糊的依赖解析为具体的版本号(例如 requests* 变成了 2.28.1)。
  • 依赖树锁定:不仅仅锁定你安装的包,还锁定了这些包所依赖的所有子包(Sub-dependencies)。
  • 安全哈希:包含每个包文件的 Hash 值。这保证了在任何机器上安装时,下载的文件内容必须与生成 Lock 文件时完全一致,防止中间人攻击或包被篡改。

3. 为什么很多人“写了很久 Python 也没用过”?

这在 Python 社区非常正常,主要原因有三点:

1.requirements.txt 的统治地位

  • 它是 Python 最原始、最通用的依赖列举方式。
  • 几乎所有的云平台(AWS, GCP, Azure)、CI/CD 工具和 IDE 都原生完美支持它。
  • 对于简单的脚本或小型微服务,它完全够用。

2.生态分裂 (The “Packaging War”)

  • Python 的包管理工具有很多流派。
  • Conda: 数据科学和 AI 领域(PyTorch, TensorFlow)通常使用 Conda 和 environment.yml,完全不依赖 Pipenv。
  • Poetry / PDM / uv: 这是目前更现代的选择。Pipenv 曾有一段时间维护停滞,导致社区转向了基于官方标准 pyproject.toml 的工具(如 Poetry)。

3.非官方标准

  • Pipfile 是 Pipenv 项目定义的格式,并不是 Python 官方标准(PEP)。目前的官方趋势是统一使用 pyproject.toml 来管理项目配置和依赖。

4. 对比:Pipenv vs requirements.txt

特性requirements.txtPipfile / Pipenv
依赖解析弱(容易出现版本冲突)强(自动计算版本兼容性)
版本锁定需要手动 pip freeze (不直观)自动 (Pipfile.lock 锁定所有子依赖)
开发依赖通常需要维护两个文件 (requirements.txt, dev.txt)内置支持 ([dev-packages])
虚拟环境管理手动 (python -m venv venv)自动 (自动创建和管理 hidden venv)
安装速度慢 (依赖解析算法复杂,Lock 过程较慢)
通用性极高中等 (需要安装 pipenv)

5. 什么时候该用哪个?

继续使用 requirements.txt

  • 你正在编写 Docker 镜像(如本项目),pip install -r requirements.txt 是最简单、层级最少的命令。
  • 团队已经习惯了这种方式,且项目依赖关系不复杂。

使用 Pipenv (Pipfile)

  • 你需要严格的确定性构建,确保生产环境和开发环境的每一个包版本(包括子依赖)都连 Hash 值都一样。
  • 你喜欢不用手动管理 source venv/bin/activate 的便利。

使用 Poetry / uv (pyproject.toml)

  • 推荐方向。如果你要开始一个新项目,或者想要构建一个 Python 包发布到 PyPI。
  • 它们使用现代标准的 pyproject.toml,速度更快(尤其是 uv),体验更好。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python selenium 父子、兄弟、相邻节点定位方式详解

    Python selenium 父子、兄弟、相邻节点定位方式详解

    这篇文章主要介绍了Python selenium 父子、兄弟、相邻节点定位方式详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • Python requests获取网页常用方法解析

    Python requests获取网页常用方法解析

    这篇文章主要介绍了Python requests获取网页常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python读取本地文件并解析网页元素的方法

    Python读取本地文件并解析网页元素的方法

    今天小编就为大家分享一篇Python读取本地文件并解析网页元素的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • python如何查看安装了的模块

    python如何查看安装了的模块

    在本篇文章里小编给大家分享的是一篇关于python查看安装了的模块的方法,需要的朋友们可以学习下。
    2020-06-06
  • 基于Python开发的高质量PDF转Word批量处理系统

    基于Python开发的高质量PDF转Word批量处理系统

    在日常的学习和开发中,我们经常遇到需要将大量 PDF 转换为 Word 文档的场景,因此,我抽时间将这个高频需求重构为一个基于 Python 开发的高质量 PDF 转 Word 批量处理系统,这不仅仅是一个自动化脚本,更是一个践行 SOLID 原则和设计模式,需要的朋友可以参考下
    2026-05-05
  • 深入解析Python中浮点数计算的精度问题与解决方案

    深入解析Python中浮点数计算的精度问题与解决方案

    本文深入解析了Python中浮点数计算的精度问题,特别是0.1+0.2不等于0.3的现象,下文会通过实际案例展示浮点数陷阱在循环控制,金融计算等场景中的风险并提供了三种解决方案,感兴趣的小伙伴可以了解下
    2026-01-01
  • 使用Python实现租车计费系统的两种方法

    使用Python实现租车计费系统的两种方法

    本文通过两种方法给大家分享了使用Python实现租车计费系统,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • python中复数的共轭复数知识点总结

    python中复数的共轭复数知识点总结

    在本篇内容里小编给大家整理的是关于python中复数的共轭复数知识点总结,有需要的朋友们可以学习下。
    2020-12-12
  • 从原理到实践详解Python音频录制与分析系统的实现

    从原理到实践详解Python音频录制与分析系统的实现

    这篇文章主要为大家详细介绍了如何使用Python实现一个完整的音频录制与分析系统,适合所有层次的开发者,文中的示例代码简洁易懂,希望对大家有所帮助
    2025-07-07
  • Python进行代码注释的9种方式

    Python进行代码注释的9种方式

    编写清晰、简洁的代码注释是良好编程习惯的重要组成部分.本文给大家介绍了9个简单易懂的代码注释示例,通过具体案例来展示不同类型的注释和最佳实践,需要的朋友可以参考下
    2026-02-02

最新评论