问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Python 中的 requirements.txt 与 setup.py

发布网友 发布时间:2024-09-27 16:03

我来回答

1个回答

热心网友 时间:2024-09-27 22:13

Python 中的 requirements.txt、setup.py 和 setup.cfg 的用途

对于新手来说,管理 Python 项目中的依赖项非常具有挑战性,这一问题由历史原因引起,并且一直受到吐槽。

本文将探讨如何正确管理 Python 项目的依赖关系。具体来说,将讨论 requirements.txt 文件的用途,以及如何使用 setuptools 来分发自定义的 Python 包,并让其他用户进一步使用和开发它。此外,还将讨论设置文件(即 setup.cfg 和 setup.py)的用途,以及如何将它们与需求文件一起使用,从而使包开发和重新分发的过程变得更容易。

Python 项目的依赖关系是什么

让我们从包依赖开始,介绍它们到底是什么,以及如何正确管理它们,因为这样可以使 Python 项目变得更容易维护。

简单来说,依赖项是我们 Python 项目所依赖的外部其他 Python 包,例如在 AI 方向,最常用的包是 Numpy 和 Pandas。在 Python 中,这些依赖通常可以在 Python 包索引(PyPI)或其他管理工具中找到(例如 Nexus),以下以 PyPI 为例介绍,因为它是最常用且大家都在用的包管理工具。

现在,我们的 Python 项目可能需要引用某个特定版本的第三方包有依赖。这种情况可能会导致依赖冲突的出现,因为我们所有的依赖中(至少)有两个依赖项可能依赖同一个包,但每个依赖项都需要该外部包的特定版本(比如一个需要 1.0,而一个需要 2.0)。在这种情况下,我们需要告诉 pip 如何处理依赖关系,以及我们需要哪些特定版本。

一般情况下,我们需要 requirements.txt 来指定项目的依赖包和版本,因此先看看 requirements.txt 的格式。

requirements.txt 文件

requirements.txt 是一个文件,列出了 Python 项目的所有依赖项。如前所述,它还可能包含依赖项的依赖项。除了列出依赖包名称外,还可以指定特定的版本(使用 ==)、>= 或 <=,甚至两者都指定。

示例 requirements.txt 文件

matplotlib >= 2.2 numpy >= 1.15.0, < 1.21.0 pandas pytest == 4.0.1

然后可以使用以下命令通过 pip 安装这些依赖项(通常在虚拟环境中):

pip install -r requirements.txt

在上面的示例中,我们指定了一些依赖项。例如,对于没有关联版本的 pandas 包,pip 将正常安装最新版本,除非其他依赖项之一与它有任何冲突(如果有冲突,pip 将安装满足其余依赖项指定条件的最新 pandas 版本)。对于 pytest,包管理器将安装特定版本(即 4.0.1),而对于 matplotlib,将安装至少大于或等于 2.2 的最新版本(这还取决于是否有其他依赖项具体要求,如果没有则会安装符合条件的最新版)。对于 numpy 包,pip 将尝试安装 1.15.0(包含)和 1.21.0(不包含)之间的最新版本。

在安装所有依赖项后,可以通过运行 pip freeze 来查看虚拟环境中安装的每个依赖项的确切版本。此命令将列出所有包及其特定版本(即 ==)。

requirements.txt 非常有用,但它仅针对我们项目的开发和发布(例如线上部署等)。如果我们想将我们的代码发布到 PyPI 供其他人使用,那么需要的不仅仅是这个文件。

Python 中的 setuptools

setuptools 是构建在 distutils 之上的包,它可以帮助开发人员快速发布 Python 包。此外,它还提供了使依赖管理更容易的功能。

当想要发布一个包时,通常需要填写一些元数据,例如包名、版本、依赖项、入口点等。setuptools 就提供了简化这些操作的功能。

项目的元数据等信息需要在 setup.py 文件中定义,例如下面的 demo:

我们所填写的信息都是纯声明性的,因此一个更好的方法是在名为 setup.cfg 的文件中定义这些元数据和信息,然后只需在 setup.py 文件中调用 setup() 即可。setup.cfg 文件如下所示:

这样在我们的 setup.py 文件中只需要保留最少的代码:

上面 install_requires 参数与 requirements.txt 类似,可以使用运算符 <、>、<=、>=、== 或!=,后跟版本标识符。当项目安装时会根据该配置来下载和安装依赖。

我们需要 requirements.txt 和 setup.py/setup.cfg 文件吗?

这就需要分情况对待了。首先,requirements.txt 与 setup.py 之间的通常用于实现不同的需求:

另外,如果同时使用两者,setup.py(setup.cfg)文件应包含抽象依赖项列表,而 requirements.txt 文件必须包含具有每个包版本的特定引脚的具体依赖项(使用 == 指定特定版本)。

以下是 Python 文档中官方的定义:

install_requires(即 setup.py)定义了单个项目的依赖关系,而 requirements.txt 通常用于定义完整的 Python 环境。

尽管 install_requires 要求很少,但 requirements.txt 通常包含详尽的固定版本列表,以实现完整环境的可重复安装。

来自: packaging.python.org/en...

总结

本文讨论了在开发 Python 项目和应用程序时适当的依赖管理的重要性。并且介绍了 requirements.txt 文件的用途以及如何将它与 setuptools 的配置文件(即 setup.py 和 setup.cfg)一起使用,这样可以保证其他开发人员可以安装、运行、开发甚至测试源代码 Python 包的代码。

setuptools 不能完全替代 requirements.txt 文件。在大多数情况下,可能需要这两个文件同时存在,这样才能够正确管理包依赖和进行包的发布。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 深度学习项目中配置文件探析,用ini、json还是yaml?附源码示例 怎么挑虾线图解怎么挑虾线 没学过高数可以考过中级统计师吗 有哪些挑虾线的技巧可以分享? 怎么弄黑虎虾的虾线可以不破坏虾肉? 为什么苹果游戏充钱不扣钱? 苹果充值成功为什么没有扣钱? 为什么苹果手机用不了支付宝了呢? 【2024国考】必背!乡村振兴核心知识点 ...烦死了苹果的王者荣耀充值不了,老是显示支付失败,我id有钱的... 新农村2024年能实现吗 氧气和氮气反应方程式 奔驰E级4月4号提的奔驰e300时尚版 怎么刹车有异响 数字姐是什么意思 上汽大众朗逸下雨后刹车异响怎么回事 17宝来刹车异响(噶哒噶哒打铁的声音)? 奔富哪个级别最好 上海的莘庄是属于哪个区邮编呢 奔富bin和max区别 山西高温电线批发 iOS10照片回忆怎么删除 iOS10回忆删除方法 toml简介,python读写toml ios10回忆怎么关闭 ...车充电器应急充电器申请CE,FCC,ROHS认证需要多少钱? iOS10系统 icould的备份照片怎么找 手机上面删除过了 最近删除里也删了... 君同鲍明是什么意思? iphone 照片怎么删除还占内存 怎么删除 有部恐怖电影里的主人公叫小武还有个叫柳思思是什么电影? 家里正在装修,散热器管子怎么走线好 如何理顺机箱内部线缆? 芝士焗大虾做法 来来来,整人了... 请问华为p40用了多长时间会坏? 华为P40能用到2024年吗? 华为p40两年后还值得入手吗? 长溪登山步道-榕树地址在哪里? 1.y²-6y-6=0 2.2x²+3x-1=0 用配方法解答 其人弗能应也中的 amp quot 弗 rdquo 是啥意思 榕树地址在哪里? 微分方程y"-5y'+6y=x2e3x的一个特解