当前位置: 首页 > 后端技术 > Python

Python中的requirements.txt和setup.py

时间:2023-03-26 12:27:57 Python

管理Python项目中的依赖项对于新手来说可能是非常具有挑战性的,这个问题是历史性的并且一直被抱怨。在今天的文章中,我们将讨论如何正确管理Python项目的依赖项。更具体地说,它讨论了requirements.txt文件的用途以及如何使用setuptools分发自定义Python包并使其进一步可供其他用户使用和开发。它还讨论了安装文件(即setup.cfg和setup.py)的用途以及如何将它们与需求文件一起使用,这可以使程序包开发和重新分发的过程更加容易。什么是Python项目依赖项?让我们从包依赖开始;它们是什么以及如何正确管理它们,因为这可以使Python项目更易于维护。简单的说,dependencies就是我们的Python项目所依赖的其他外部Python包。比如在AI方向,使用最多的包是Numpy和Pandas。在Python中,这些依赖通常可以在PythonPackageIndex(PyPI)或其他管理工具(如Nexus)中找到,我们将以PyPI为例,因为它是大家最常用的包管理工具。现在我们自己的Python项目可能需要引用某个特定版本的第三方包有依赖。这种情况会导致依赖冲突,因为(至少)我们的两个依赖可能依赖同一个包,但每个依赖都需要该外部包的特定版本(比如一个需要1.0,而一个需要2.0)。在这种特殊情况下,我们需要告诉pip如何处理依赖项以及我们需要哪些特定版本。一般来说,我们需要requirements.txt来指定项目的依赖包和版本,那么我们先来看看requirements.txt的格式。requirements.txt文件requirements.txt是一个列出了一个Python项目的所有依赖的文件。如前所述,它还可能包含依赖项的依赖项。除了依赖包名称之外,列还可以指定特定版本(使用==)、>=或<=,甚至两者。例子requirements.txt文件matplotlib>=2.2numpy>=1.15.0,<1.21.0pandaspytest==4.0.1然后可以通过pip(通常在虚拟环境中)安装这些依赖:pipinstall-rrequirements.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中的setuptoolssetuptools是构建在distutils之上的一个包,可以帮助开发者快速发布Python包。除其他外,它还提供了使依赖管理更容易的功能。当你要发布一个包时,通常需要填写一些元数据,比如包名、版本、依赖、入口点等,setuptools提供了简化这些操作的功能。需要在setup.py文件中定义项目元数据等信息,比如下面的demo:fromsetuptoolsimportsetupsetup(name='demo',author='deephub',version='0.1',install_requires=['pandas','numpy','matplotlib',],#...moreoptions/metadata)我们填写的信息纯粹是声明性的,所以更好的做法是在一个名为setup.cfg的文件中定义这些元数据数据和信息,然后只需调用setup.py文件中的setup()即可。setup.cfg文件如下所示:[metadata]name=demoauthor=deephubversion=0.1[options]install_requires=pandasnumpymatplotlib这样我们只需要在setup.py文件中保留最少的代码:fromsetuptoolsimportsetupif__name__=="__main__":setup()上面的install_requires参数类似于requirements.txt,可以使用操作符<,>,<=,>=,==or!=,后跟版本标识符。安装项目时,会根据这个配置下载并安装依赖。我们需要requirements.txt和setup.py/setup.cfg文件吗?这需要根据具体情况进行处理。首先,requirements.txt和setup.py的区别通常是为了实现不同的需求:如果主要用于项目开发,不打算在pypi上发布,requirements.txt就足够了(即使packageismultiple如果包只是在单机上开发,但需要以pip包的形式发布到pypi上,那么setup.py/setup.cfg就足够了。如果包是在多台机器上开发的,需要发布到pypi上,这就需要requirements.txt(多台机器需要相同的开发环境)和setup.py/setup.cfg文件(发布到pypi上)。另一个是,如果同时使用两者,setup.py(setup.cfg)文件应包含抽象依赖项列表,而requirements.txt文件必须包含具体依赖项,每个包版本具有特定的引脚(使用==指定特定版本)。以下是Python文档中的官方定义:install_requires(即setup.py)定义了单个项目的依赖,而requirements.txt通常用于定义完整的Python环境。虽然install_requires很少而且相差甚远,但requirements.txt通常包含详尽的固定版本列表,以实现完整环境的可重复安装。来自:https://www.overfit.cn/post/f5fac53241d643c9a343260ede9aee81总结本文讨论了在开发Python项目和应用程序时进行适当的依赖管理的重要性。还介绍了requirements.txt文件的用途以及如何与setuptools的配置文件(即setup.py和setup.cfg)一起使用,方便其他开发者安装、运行、开发甚至测试Python源码包裹。代码。setuptools不能完全替代requirements.txt文件。并且在大多数情况下,这两个文件可能需要同时存在,这样才能正确管理包依赖,进行包发布。添加一名作者