【Python】Python项目中的依赖与配置:requirements.txt、setup.py、pyproject.toml 详解

在昨天的文章【Python】通过Editable Install模式详解,解决Python开发总是import出错的问题 中, 我们提到了Python项目的配置文件requirements.txtsetup.pypyproject.toml。在昨天的解决方案中, 我们同时维护了这三个文件。 由同学就问:真的需要这么复杂的同时维护三个文件吗? 今天,田辛老师就来详细解释一下这三个文件。 包括他们的核心用途、演变历史等等。 希望通过这篇文章, 读者思考在你的项目中, 是否需要保留他们。

1. requirements.txt : 最最简单的依赖列表

定位:最基础的依赖声明文件,通常用于直接安装依赖。
用途

  • 列出项目运行所需的第三方包及其版本(例如 requests==2.25.1)。
  • 通过 pip install -r requirements.txt 一键安装依赖。
  • 常用于开发环境或生成依赖快照(如 pip freeze)。

局限性

  • 仅记录依赖包,不区分开发依赖、生产依赖或操作系统级的依赖。
  • 无法定义包的安装方式(例如从Git仓库或本地路径安装)。
  • 与项目打包(如生成 .whl 或上传到PyPI)无关。

2. setup.py:传统的打包配置

2.1. 定位

基于 setuptools 的打包工具配置文件,用于构建和分发Python包。

2.2. 用途

  • 定义项目元数据(名称、版本、作者等)。
  • 声明依赖(install_requires)、开发依赖(extras_require)以及可执行脚本。
  • 通过 python setup.py installpip install . 安装本地包。

2.3. 示例片段

from setuptools import setupsetup(name="tdouya_tools",version="0.1",install_requires=["requests>=2.25"],extras_require={"dev": ["pytest"]},
)

2.4. 缺点:

  • 配置复杂,需要编写Python代码(而非声明式配置)。
  • 依赖动态执行(可能存在安全隐患)。
  • 无法直接支持现代构建后端(如 poetryflit )。

3. pyproject.toml:现代的统一配置

3.1. 定位

PEP 518 引入的标准化配置文件,旨在统一项目构建和元数据配置。

3.2. 用途:

  • 指定构建系统的依赖(如 setuptools、poetry 或 flit)。
  • 声明项目元数据、依赖及版本约束(遵循PEP 621标准)。
  • 支持动态依赖分离(生产依赖、开发依赖、测试依赖等)。

3.3. 示例片段

使用 PEP 621 格式

[project]
name = "my_project"
version = "0.1"
dependencies = ["requests>=2.25"][project.optional-dependencies]
dev = ["pytest"]

优势

  • 声明式配置:更简洁且易于维护。
  • 兼容性:支持现代工具链(如 poetrypipenv)。
  • 扩展性:可整合代码格式化、测试配置等其他工具(如 blackcoverage)。

4. 三者是否需要共存?

田老师回答: 通常不需要,但取决于项目需求和工具链。对于某些场景,同时保留 requirements.txt 和 setup.py 可能带来实际价值。

4.1. 场景分析

4.1.1. 传统项目(仅用 setuptools
  • 需要 setup.py + requirements.txt
    • setup.py 用于定义打包元数据和依赖(install_requires),适合发布到 PyPI
    • requirements.txt 可以细化开发环境依赖(如测试框架 pytest、代码格式化工具 black),并通过 pip install -r requirements.txt 快速安装。
    • 优势:职责分离,setup.py 关注生产依赖和分发,requirements.txt 管理开发工具和环境复现。

    这也是田辛老师的项目中, 往往这两个文件同时存在的原因。

4.1.2. 兼容旧工具链或脚本
  • 许多CI/CD流水线、自动化脚本或开发者习惯依赖 requirements.txt 快速安装依赖。
  • 保留 setup.py 可以兼容 python setup.py install 等传统构建命令,避免破坏遗留工作流程。
  • 示例:
    # 开发时安装开发依赖
    pip install -r requirements.txt
    # 构建时通过 setup.py 安装生产包
    python setup.py build
    
4.1.3. 渐进式迁移到 pyproject.toml

在过渡阶段,同时保留 setup.pyrequirements.txt 可降低迁移风险:

  • pyproject.toml 定义核心配置和构建后端。
  • setup.py 作为备用接口(例如兼容未完全支持 PEP 621 的工具)。
  • requirements.txt 继续用于开发环境依赖安装。
4.1.4. 依赖管理的灵活性
4.1.4.1. 细粒度控制:
  • 在 requirements.txt 中指定复杂依赖(如 Git 仓库、本地路径或特定系统级包)。
  • 在 setup.py 的 install_requires 中仅声明最小化生产依赖,保持分发包的轻量性。
4.1.4.2. 示例:
# setup.py 中仅保留核心依赖
install_requires = ["requests>=2.25"]
# requirements.txt 包含开发工具和环境约束
pytest==7.4.0
black==23.9.1
-e .  # 以可编辑模式安装当前包
4.1.4.3. 关键决策点
  • 是否依赖旧工具或脚本:若团队或工具链重度依赖 requirements.txt,保留它可以减少迁移成本。
  • 是否需要快速环境复现requirements.txt 结合 pip freeze 能生成精确的依赖快照,适合快速复制开发环境。
  • 是否需要兼容非打包场景:例如在 Dockerfile 中直接使用 requirements.txt 安装依赖,而非通过包构建流程。

5. 最佳实践建议

5.1. 新项目优先使用 pyproject.toml

通过 PEP 621 或工具(如 poetry)定义元数据和依赖,无需 setup.pyrequirements.txt

5. 2. 旧项目逐步迁移

保留 setup.py 但逐步将配置转移到 pyproject.toml,例如使用 setuptools 的 [project] 表。

5.3 . 区分 requirements.txt 的使用场景

如果仍需用它,可以自动生成:

# 通过 poetry 生成
poetry export -f requirements.txt --output requirements.txt

5.4 . 避免重复声明依赖

不要同时在 setup.pypyproject.toml 中声明依赖,否则会导致维护负担。

6. 结论

在现代1Python1生态中,pyproject.toml 是未来的方向,能够取代 setup.pyrequirements.txt 的大部分功能。对于新项目,推荐仅使用 pyproject.toml 并结合工具(如 poetry)管理依赖和构建流程。旧项目可视情况逐步迁移,无需强制三者共存。最终目标是简化配置、减少冗余,并拥抱标准化。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细聊聊 Synchronized,以及锁的升级过程

在Java中,synchronized关键字是用于实现线程同步的重要机制,它通过内置锁(Monitor)确保多个线程对共享资源的安全访问。 1. synchronized 的基本使用与实现原理 使用方式 修饰实例方法:锁是当前对象实例。public syn…

vue3的深入组件-组件 v-model

组件 v-model 基本用法​ v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始&#xff0c;推荐的实现方式是使用 defineModel() 宏&#xff1a; <script setup> const model defineModel()function update() {model.value } </script><template>…

15.thinkphp的上传功能

一&#xff0e;上传功能 1. 如果要实现上传功能&#xff0c;首先需要建立一个上传表单&#xff0c;具体如下&#xff1a; <form action"http://localhost/tp6/public/upload"enctype"multipart/form-data" method"post"><input type&…

word文档基本操作: 编辑页眉页脚和插入目录

文章目录 引言I 编辑页眉页脚II 插入目录III 知识扩展基于axure画架构图基于Knife4j导出接口文档基于PDManer导出数据库设计文档引言 背景: 信息安全认证需要准备相关文件用于审核 一般的开发设计包含总体设计、概要设计、详细设计、接口设计、数据库设计、部署结构设计、原型…

Qt 通过控件按钮实现hello world + 命名规范(7)

文章目录 使用编辑框来完成 hello world通过编辑图形化界面方式通过纯代码方式 通过按钮的方式来创建 hello world通过编辑图形化界面方式通过纯代码方式 总结Qt Creator中的快捷键如何使用文档命名规范 简介&#xff1a;这篇文章着重点并不在于创建hello world程序&#xff0c…

实时网络流量监控与防御:Python实现DDoS攻击检测

1. 需求分析 DDoS攻击通过海量请求耗尽服务器资源。本文使用 Python Scapy 实时监控流量&#xff0c;自动触发IP封禁。 2. 核心代码实现 2.1 依赖安装 pip install scapy psutil2.2 流量监控脚本&#xff08;ddos_detector.py&#xff09; import time from scapy.all im…

电赛经验分享——模块篇

1、前言 打算在这一个专栏中&#xff0c;分享一些本科控制题电赛期间的经验&#xff0c;和大家共同探讨&#xff0c;也希望能帮助刚刚参加电赛的同学&#xff0c;了解一些基本的知识。一些见解和看法可能不同或有错误&#xff0c;欢迎批评指正。 在本文中&#xff0c;主要介绍笔…

【LLM】Open WebUI 使用指南:详细图文教程

Open WebUI 是一个开源的、可扩展且用户友好的自托管 AI 平台,专为生成式人工智能模型交互而设计。 Open WebUI 旨在为用户提供一个简单易用、功能强大且高度定制化的界面,使其能够轻松与各种 AI 模型(如文本生成、图像生成、语音识别等)进行交互。 一、安装与初始化配置 扩…

HarmonyOS Next~HarmonyOS应用测试全流程解析:从一级类目上架到二级类目专项测试

HarmonyOS Next&#xff5e;HarmonyOS应用测试全流程解析&#xff1a;从一级类目上架到二级类目专项测试 引言&#xff1a;HarmonyOS生态下的质量保障挑战 在万物互联的智能时代&#xff0c;HarmonyOS作为分布式操作系统&#xff0c;为开发者带来了前所未有的创新空间&#x…

一种机载扫描雷达实时超分辨成像方法——论文阅读

一种机载扫描雷达实时超分辨成像方法 1. 专利的研究目标与产业意义1.1 研究目标与实际问题1.2 产业意义2. 专利的创新方法:滑窗递归优化与实时更新2.1 核心模型与公式2.2 与传统方法对比优势3. 实验设计与验证3.1 仿真参数3.2 实验结果4. 未来研究方向与挑战4.1 学术挑战4.2 技…

滚筒洗衣机拆解学习

本文图片来自于B站视频&#xff0c;链接在文末&#xff0c;不涉及任何公司及实验室产品 对小米滚筒洗衣机进行拆解&#xff0c;并收集了用户对这款产品的评价&#xff0c;认识了关键部件。下一步重点学习对各个电机的控制逻辑和供电系统。 整机拆解学习&#xff1a; 功能面板…

【金仓数据库征文】金仓数据库 KingbaseES 在电商平台数据库迁移与运维中深入复现剖析

【金仓数据库征文】金仓数据库 KingbaseES 在电商平台数据库迁移与运维中深入复现剖析 前言 在当今数字化商业蓬勃发展的时代&#xff0c;电商平台的数据量呈爆发式增长&#xff0c;对数据库性能、稳定性和扩展性提出了极高要求。本文章基于大型电商平台原本采用 MySQL 数据库&…

iPhone手机连接WiFi异常解决方法

iPhone手机连接WiFi异常解决方法 一、问题现象二、iPhone连不上可能的原因三、基础排查与快速修复第一步:重启大法第二步:忽略网络,重新认证第三步:关闭“私有无线局域网地址”第四步:修改DNS服务器第五步:还原网络设置四、路由器端排查及设置关闭MAC地址过滤或添加到白名…

Android NDK版本迭代与FFmpeg交叉编译完全指南

在Android开发中&#xff0c;使用NDK(Native Development Kit)进行原生代码开发是一项常见需求&#xff0c;特别是当我们需要集成FFmpeg这样的多媒体处理库时。本文将深入分析Android NDK的版本迭代分界线&#xff0c;详细讲解FFmpeg交叉编译的注意事项&#xff0c;并提供完整的…

typecho中的Widget设计文档

组成系统的最基本元素 什么是Widget Widget是组成Typecho的最基本元素&#xff0c;除了已经抽象出来的类库外&#xff0c;其它几乎所有的功能都会通过Widget来完成。在实践中我们发现&#xff0c;在博客这种小型但很灵活的系统中实施一些大型框架的思想是不合适的&#xff0c…

Python序列Day3

序列 序列是一种数据存储方式&#xff0c;用方括号标注&#xff0c;逗号分隔的一组值。在内存中&#xff0c;序列就是一块用来存放多个值的连续的内存空间。 常见序列结构有&#xff1a;字符串、列表、元组、字典、集合 列表 用于存储任意数目&#xff0c;任意类型的数据集…

私服与外挂:刑事法律风险的深度剖析

首席数据官高鹏律师团队编著 在当今数字化时代&#xff0c;网络游戏产业蓬勃发展&#xff0c;然而与之相伴的私服与外挂现象却屡禁不止&#xff0c;且其背后隐藏着严重的刑事法律风险。作为一名律师&#xff0c;有必要在此对私服与外挂相关的刑事问题进行深入解读&#xff0c;以…

Linux云计算训练营笔记day04(Rocky Linux中的命令)

mv 移动(剪切) 源数据会消失 格式: mv 源文件 目标路径 touch /opt/a.txt 创建文件 mv /opt/a.txt /root 移动文件&#xff0c;没有改名 mkdir gongli 创建目录 mv gongli /opt/ 移动目录&#xff0c;没有改名 mv /opt/gongli tedu 移动目录&#xff0c;改名了 …

蓝桥杯青少 图形化编程——“星星”点灯

蓝桥杯青少 图形化编程——“星星”点灯 编程实现&#xff1a; 有10盏灯&#xff0c;从1到10按顺序依次编号&#xff0c;初始时全部灯处于开启状态。有10个人也从1到10依次编号。第一个人&#xff08;1号&#xff09;将灯全部关闭&#xff0c;第二个人&#xff08;2号&#x…

conda配置好的pytorch在jupyter中如何配置

配置 其实不用再配置了 如下图&#xff08;主要是激活pytorch环境&#xff0c;再jupyter notebook&#xff09; jupyter运行快捷键shiftenter 新建文件夹folder&#xff0c;新建notebook 使用 帮助文档&#xff08;两种方式&#xff09; ctrl/ 注释