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文件matplotlib2。2numpy1。15。0,1。21。0pandaspytest4。0。1 然后就可以使用以下命令通过pip安装这些依赖项(通常在虚拟环境中):pipinstallrrequirements。txt 在上面的示例中,我们指定了一些依赖项。例如,对于没有关联版本的的pandas包,pip将正常安装最新版本,除非其他依赖项之一与它有任何冲突(如果有冲突,pip将安装满足其余依赖项指定条件的最新pandas版本)。对于pytest,包管理器将安装特定版本(即4。0。1),而对于matplotlib,将安装至少大于或等于2。2的最新版本(这还是取决于是否有其他依赖项具体要求,如果没有则会安装符合条件的最新版)。对于numpy包,pip将尝试安装1。15。0(包含)和1。21。0(不包含)之间的最新版本。 在安装所有依赖项后,可以通过运行pipfreeze来查看虚拟环境中安装的每个依赖项的确切版本。此命令将列出所有包及其特定版本(即)。 requirements。txt非常有用,但他只针对于我们项目的开发和发布(例如线上部署等)。如果你想将你代码发布到PyPI供其他人使用,那么需要的不仅仅是这个文件。Python中的setuptools setuptools是构建在distutils之上的包,它可以帮助开发人员快速发布Python包。除此以外它还提供了使依赖管理更容易的功能。 当想要发布一个包时,通常需要填写一些元数据,例如包名、版本、依赖项、入口点等。setuptools就提供了简化这些操作的功能。 项目的元数据等信息需要在setup。py文件中定义,例如下面的demo:fromsetuptoolsimportsetupsetup(namedemo,authordeephub,version0。1,installrequires〔pandas,numpy,matplotlib,〕,。。。moreoptionsmetadata) 我们所填写的信息都是纯声明性的,所以一个更好的方法是在名为setup。cfg的文件中定义这些元数据和信息,然后只需在setup。py文件中调用setup()即可。setup。cfg文件如下所示:〔metadata〕namedemoauthordeephubversion0。1〔options〕installrequirespandasnumpymatplotlib 这样在我们的setup。py文件中只需要保留最少的代码:fromsetuptoolsimportsetupifnamemain:setup() 上面installrequires参数与requirements。txt类似,可以使用运算符、、、、或!,后跟版本标识符。当项目安装时会根据该配置来下载和安装依赖。我们需要requirements。txt和setup。pysetup。cfg文件吗? 这就需要分情况对待了。首先requirements。txt与setup。py之间的通常用于实现不同的需求:如果主要用于项目开发目的,并且不打算发布到pypi上,则requirements。txt就足够了(即使该包是在多台机器上开发的)如果包仅在单机开发,但是需要把他作为pip的包发布到pypi上,那么setup。pysetup。cfg就足够了。如果包是在多台机器上开发的并且还需要把他发布到pypi上,这就需要requirements。txt(多个机器需要相同的开发环境)和setup。pysetup。cfg文件(发布到pypi上)。 另外就是如果同时使用两者,setup。py(setup。cfg)文件应包含抽象依赖项列表,而requirements。txt文件必须包含具有每个包版本的特定引脚的具体依赖项(使用指定特定版本)。 以下是Python文档中官方的定义:installrequires(即setup。py)定义了单个项目的依赖关系,而requirements。txt通常用于定义完整Python环境。 尽管installrequires要求很少,但requirements。txt通常包含详尽的固定版本列表,以实现完整环境的可重复安装。 总结 本文中讨论了在开发Python项目和应用程序时适当的依赖管理的重要性。并且介绍了requirements。txt文件的用途以及如何将它与setuptools的配置文件(即setup。py和setup。cfg)一起使用,这样可以保证其他开发人员可以安装、运行、开发甚至测试源代码Python包的代码。 setuptools并不能完全替代requirements。txt文件。并且在大多数情况下,可能需要这两个文件同时存在,这样才能够正确管理包依赖和进行包的发布。 作者:GiorgosMyrianthous