尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python 中的 requirements.txt 与 setup.py

Python 中的 requirements.txt 与 setup.py 中 .txt、setup.py 和 setup.cfg 的用途对于新手来说, 管理项目中的依赖项是一件非常具有挑战性的事情。这个问题是由于历史原因引起的, 一直被人吐槽。在今天的文章中, 我们将讨论怎样去正确地管理项目的依赖关系。更具体一些来看, 我们会去讨论一下那个以txt为后缀的文件是干什么用的。同时, 我们还会去讲讲怎么去利用相关工具来分发那些你自己定义的包。这样做的目的是为了让其他的用户能够进一步地去使用它, 还有对它进行开发方面的操作。另外, 还会去聊一下那个设置文件的用处, 也就是 setup.cfg 这个文件和 setup.py 这个文件具体是干嘛用的。同时, 也会聊怎么把它们跟需求文件搭在一起配合使用, 这么干的话, 就能够让你的包的开发工作还有重新分发的工作变得轻松一点, 容易一点。项目的依赖关系是什么我们从包依赖方面开始着手, 先把包依赖到底是什么这个问题给弄清楚, 然后再来讲一讲该怎么去对它们进行正确的管理, 这样做出来以后的结果呢, 就是可以使项目变得更容易去维护了这一点是确实无疑的。一句话概括, 依赖项指的是我们的项目所需要使用的外部其他软件包。就拿人工智能这个领域来说吧, 里面用得最多的软件包就是Numpy和另一个我们这里没具体说出来的那个。在相关的开发环境里, 这些依赖通常都可以在PyPI这个软件包索引上面找到, 或者在其他的管理工具里面也能找到, 比如Nexus也行。但是往后我们就只用PyPI做一个例子来介绍好了。选择它的原因主要是因为它是最常用的, 而且大家都在用这个包管理工具。在当下, 咱们自家搞的项目里面, 说不定会碰到需要引荐某个固定版本的第三方的包, 而这玩意儿还有依赖关系。眼下的这个状况, 很有可能就会导致依赖冲突的现象发生。原因在于, 在我们所拥有的一切的依赖中, 至少会有这两个依赖项, 它们有可能同时都去依赖同一个包。然而, 这里头的问题在于, 每一个那个依赖项, 都需要这个外面的包的特定的一个版本, 比方说, 有一个是需要1.0的这个样子, 而另外的一个则需要2.0的版本。对于这种特殊的状况, 我们有必要向 pip 这个工具进行说明, 以便让它明确知道应该如何去处理那些复杂的依赖关系, 同时也需要清楚地告知它, 我们究竟需要安装哪些具体对应的版本号。在日常状况下面, 我们一般需要用到后缀为 .txt 的这个文件来指明项目里所需的依赖包以及对应的具体版本号, 因此, 我们应当首先去查阅并理解这类 .txt 文件格式具有怎样的结构与特点。.txt 文件.txt 是一个文件, 它列出了, 项目的所有依赖项, 前面已经讲过了, 这个文件里面, 还可能包含, 那些依赖项自己的, 所谓的依赖项, 在列出那个依赖包的名称的时候, 除了只写名字以外, 还可以去指定, 一个特定的版本情况, 这个操作, 是使用双等于号 这个符号来表示的, 当然, 你也可以选用大于等于号 或者等于符号加版本号, 像等于二点二的这种写法, 2.2。numpy1.15.0,4.0.1然后接下来就可以使用以下这个命令, 借助pip工具去把那些所需要的依赖项进行安装, 一般情况下都是建议选择在虚拟环境里面来完成此操作的。pip -r .txt在上面所展示的那种示例情况里, 我们当时针对部分依赖项做了设定, 那么具体来说就是, 假如说出现了一个包, 它自身并没有附带相关联的那个版本信息的话, 在这种条件下, pip 这个工具就会按照通常的处理方式来安装那个版本的最新版本内容, 但是这里面还有一个特殊情况需要注意, 那就是如果还有其他其他的依赖项彼此之间存在某些相互冲突的情况, 一旦检测到这种冲突存在, 那么 pip 在最终执行安装操作时, 就不会单纯地安装最新的一个版本了, 而是会选择去安装一个能够满足剩下的那些依赖于它指定条件的新版本。对于包管理器将安装特定版本即 4.0.1而对于 将安装至少大于或等于 2.2 的最新版本这还是取决于是否有其他依赖项具体要求如果没有则会安装符合条件的最新版 。对于 numpy 包pip 将尝试安装 1.15.0包含和 1.21.0不包含之间的最新版本。在所有依赖项都被安装完毕之后, 我们可以通过运行一个特定的命令, 来查看在虚拟环境内部所安装的那些每一个依赖项的具体版本情况。这个命令的作用是列出所有的软件包名称, 并且还会标明它们各自所对应的特定版本号, 也就是以双等号即这样的一种形式来表示。pip.txt 文件是非常有用的, 但是, 它只是针对着我们项目本身的开发环节以及最终的发布工作, 比如说线上的部署这类事情来说的。如果你是想把你写的这些代码发布到 PyPI 这个平台上, 让别的很多的人都可以去使用的话, 那么, 你需要的肯定就不会仅仅是这么区区一个 .txt 文件这么简单了。中的这个内容是在基于已有的基础结构而搭建的一个软件包, 它能够给广大的开发者朋友们带来便利, 让大家能够迅速地将所需的软件组件发布出去。除此之外, 该软件包还额外提供了一系列强大的功能选项, 从而使对各类资源依赖关系的统一管理变得更加轻松简单且富有成效。当用户想要去发布一个包的时候, 通常情况下需要填写好各种必要的元数据信息, 这些信息具体包含了像包名这样的标识, 还包含了版本号、依赖项的配置, 以及程序的入口处设置等等内容, 而该系统提供了用来简化这些繁琐操作的具体功能。该项目的元数据之类的信息, 是需要在这类setup.py文件的里面进行定义的, 譬如说, 下面给出的这个demo的例子的。from setupsetup(,0.1,,numpy,,# ... more /我们填写的那些信息都是纯声明式性质的, 因此有个更优的做法, 也就是在名为 setup.cfg 的文件里去定义这些元数据和信息, 而后只需要在 setup.py 这个文件内部去直接调用 setup() 这一个函数就行了。那个 setup.cfg 文件的呈现形式跟下面的内容是一模一样的。name demo 0.1numpy因此, 在我们的 setup.py 这个文件里面, 咱们就只要留下那些最少的代码就可以了, 就这么点事:from setupif :setup()上面提到的参数, 其形式是与名为“.txt”的文本文件类似的东西。这些参数可以使用包括左箭头、等于号、双等于号或者是非不等于号在内的运算符。在这些运算符之后, 还需要跟上表示版本的具体标识符。当系统对具体的项目执行安装这个动作的时候, 它会根据这一份配置内容的指引, 去进行依赖包资源的下载以及随后的安装过程。我们需要 .txt 和 setup.py/setup.cfg 文件吗这就得看具体的情形来决定了。首先.txt这个文件和setup.py这个文件之间, 通常是用于实现不一样的需求的。再者呢, 假如是同时去使用这两个东西的话, setup.py以及setup.cfg这个文件里面应该是包含有那种抽象类型的依赖项列表的, 与此同时.txt这个文件则是必须得去包含具体那些个引脚形式的、带有每个包的特定版本的依赖项内容, 而且这是要使用等于号加等于号这个方法去指定特定的那个版本的。根据文档里所提供的官方说法来进行定义的。就是setup.py这个文件, 它被用来定义单个项目所需要的依赖关系。然后那些以txt为后缀结尾的文件通常就被拿过来做完整环境中的依赖定义用着了。虽然有 要求很少这么一说, 但是呢, .txt 这份文件里面通常还是包含着一个非常详尽的固定版本的列表, 目的就是为了能够实现那种完整环境下的可重复安装过程。
返回列表