luc*_*ucy 68 python setup.py requirements.txt
我开始使用Python.我已经添加了requirements.txt和setup.py我的项目.但是,我仍然对这两个文件的目的感到困惑.我读过这setup.py是为可再发行的东西而requirements.txt设计的,它是为不可再发行的东西而设计的.但我不确定这是否准确.
这两个文件真的打算如何使用?
And*_*asT 45
requirements.txt
这有助于您设置开发环境.像程序一样pip可以用来安装文件中列出的所有软件包.之后,您可以开始开发python脚本.如果您计划让其他人参与开发或使用虚拟环境,则特别有用.这是你如何使用它:
pip install -r < requirements.txt
Run Code Online (Sandbox Code Playgroud)
setup.py
这允许您创建可以重新分发的包.此脚本旨在将程序包安装在最终用户的系统上,而不是像以前那样准备开发环境pip install -r < requirements.txt.有关setup.py的更多详细信息,请参阅此答案.
两个文件中都列出了项目的依赖项.
ini*_*_js 35
简短的回答是requirements.txt仅用于列出包装要求.setup.py另一方面更像是安装脚本.requirements.txt除了包依赖关系之外,还描述了应该打包(或编译,在本机模块的情况下(即用C编写))的文件和模块集,以及要添加到python包列表的元数据(例如包名称,包版本,包描述,作者,...).
由于两个文件都列出了依赖关系,因此可能会导致一些重复.请阅读以下详细信息.
requirements.txt
该文件列出了python包的要求.它是一个纯文本文件(可选择带注释),列出了python项目的包依赖项(每行一个).它没有描述python包的安装方式.您通常会使用需求文件setup.py.
文本文件的文件名是任意的,但通常pip install -r requirements.txt是按惯例.在探索其他python包的源代码存储库时,您可能会偶然发现其他名称,例如requirements.txt或dev-dependencies.txt.这些目的与目的相同,dependencies-dev.txt但通常列出特定包的开发人员感兴趣的其他依赖关系,即在发布之前测试源代码(例如pytest,pylint等).该软件包的用户通常不需要整套开发人员依赖项来运行该软件包.
如果dependencies.txt存在多个变体,那么通常会列出运行时依赖项,以及其他构建时或测试依赖项.有些项目还会对其需求文件进行级联,即当一个需求文件包含另一个文件时(例如).这样做可以减少重复.
setup.py
这是一个python脚本,它使用requirements-X.txt模块定义python包(名称,包含的文件,包元数据和安装).它也会setuptools列出包的运行时依赖性.Setuptools是构建和安装python包的事实上的方法,但它有它的缺点,随着时间的推移,新的"元包管理器"的发展,如pip.setuptools的示例缺点是它无法安装同一个包的多个版本,并且缺少卸载命令.
当python用户执行requirements.txt(或pip install ./pkgdir_my_module)时,pip将pip install my-module在给定目录(或模块)中运行.类似地,任何具有setup.py可以setup.py安装的模块,例如通过pip从同一文件夹运行.
我真的需要两者吗?
简短的回答是否定的,但两者都很好.它们实现了不同的目的,但它们都可以用来列出您的依赖项.
您可以考虑使用一种技巧来避免重复pip install .和之间的依赖关系列表requirements.txt.如果您已经setup.py为您的软件包编写了一个完全正常工作,并且您的依赖项主要是外部的,那么您可以考虑使用setup.py以下内容进行简单操作:
# requirements.txt
#
# installs dependencies from ./setup.py, and the package itself,
# in editable mode
-e .
# (the -e above is optional). you could also just install the package
# normally with just the line below (after uncommenting)
# .
Run Code Online (Sandbox Code Playgroud)
这requirements.txt是一个特殊-e选项,可以在可编辑模式下安装给定的包.当pip install在此文件上运行时,pip将通过列表中的安装依赖项pip -r requirements.txt.可编辑选项将在安装目录中放置符号链接(而不是鸡蛋或存档副本).它允许开发人员从存储库中编辑代码而无需重新安装.
当您的软件包存储库中包含这两个文件时,您还可以利用所谓的"setuptools extras".您可以在自定义类别下的setup.py中定义可选包,并使用pip从该类别安装这些包:
# setup.py
from setuptools import setup
setup(
name="FOO"
...
extras_require = {
'dev': ['pylint'],
'build': ['requests']
}
...
)
Run Code Online (Sandbox Code Playgroud)
然后,在需求文件中:
# install packages in the [build] category, from setup.py
# (path/to/mypkg is the directory where setup.py is)
-e path/to/mypkg[build]
Run Code Online (Sandbox Code Playgroud)
这会将所有依赖项列表保存在setup.py中.
注意:您通常会从沙箱中执行pip和setup.py,例如使用该程序创建的沙箱./setup.py.这将避免在项目开发环境的上下文之外安装python包.
长话短说
requirements.txt列出具体的依赖关系setup.py列出抽象依赖关系关于 Python 中的依赖关系管理的一个常见误解是是否需要使用requirements.txt 或 setup.py文件来处理依赖关系。
您可能必须同时使用两者才能确保在 Python 项目中正确处理依赖项。
该requirements.txt文件应该列出具体的依赖关系。换句话说,它应该列出固定的依赖项(使用==说明符)。然后将使用该文件来创建一个工作虚拟环境,该环境将安装具有指定版本的所有依赖项。
另一方面,该setup.py文件应列出抽象依赖项。这意味着它应该列出运行项目的最小依赖项。除了依赖管理之外,该文件还服务于包分发(比如在 PyPI 上)。
如需更全面的阅读,您可以阅读TDS 上的requests.txt 与 Python 中的 setup.py一文。
现在,从 PEP-517 和 PEP-518 开始,您可能必须使用 apyproject.toml来指定要用作setuptools构建工具,并使用附加setup.cfg文件来指定详细信息。有关更多详细信息,您可以阅读文章setup.py vs setup.cfg in Python。
为了完整起见,以下是我从3个不同角度看待它的方式。
这是官方文档(重点是我的)中引用的精确描述:
尽管install_requires(在setup.py中)定义了单个项目的依赖关系,但“需求文件”通常用于定义完整Python环境的需求。
尽管install_requires的需求最少,但是需求文件通常包含固定版本的详尽列表,目的是实现完整环境的可重复安装。
但这可能仍然不容易理解,因此在下一节中,将提供2个事实示例,以不同的方式演示应如何使用这两种方法。
因此,它们的实际用法(应该是)不同
如果您的项目foo将作为独立的库发布(这意味着其他人可能会这样做import foo),那么您(和下游用户)将希望有一个灵活的依赖声明,这样您的库就不会(而且一定不能) )对您的依赖项的确切版本“保持警惕”。因此,通常,您的setup.py将包含以下行:
install_requires=[
'A>=1,<2',
'B>=2'
]
Run Code Online (Sandbox Code Playgroud)如果您只是想以某种方式为您的应用程序“记录”或“固定”您的EXACT当前环境bar,这意味着您或您的用户想bar按原样使用您的应用程序,即运行python bar.py,您可能希望冻结您的环境,以便它总是表现相同。在这种情况下,您的需求文件将如下所示:
A==1.2.3
B==2.3.4
# It could even contain some dependencies NOT strickly required by your library
pylint==3.4.5
Run Code Online (Sandbox Code Playgroud)实际上,我该使用哪一个?
如果您正在开发bar将由所使用的应用程序python bar.py,即使该应用程序只是“有趣的脚本”,仍然建议您使用Requirements.txt,因为谁知道下周(恰好是圣诞节)您会收到新计算机作为礼物,因此您需要在此重新设置您的确切环境。
如果您正在开发foo将由所使用的库,则必须import foo准备setup.py。期。但是您仍然可以选择同时提供require.txt,这可以:
(a)采用任何一种A==1.2.3风格(如上文第2条所述);
(b)或只包含一个魔法单曲 .
.
Run Code Online (Sandbox Code Playgroud)
大致等于“基于setup.py安装要求”,而无需重复。就我个人而言,我认为最后一种方法模糊了界限,增加了混乱,并没有真正增加价值,但这仍然是Python包装维护商Donald在他的博客文章中提到的一种方法。
| 归档时间: |
|
| 查看次数: |
19568 次 |
| 最近记录: |