乐趣区

关于python:Python-中的-requirementstxt-与-setuppy

老手而言治理 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:

from setuptools import setup
setup(     
    name='demo',
    author='deephub',     
    version='0.1',     
    install_requires=[         
        'pandas',         
        'numpy',
        'matplotlib',
    ],
    # ... more options/metadata
)

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

[metadata]
name = demo
author = deephub
version = 0.1
[options]
install_requires =
    pandas
    numpy
    matplotlib

这样在咱们的 setup.py 文件中只须要保留起码的代码:

from setuptools import setup
if __name__ == "__main__":
    setup()

下面 install_requires 参数与 requirements.txt 相似,能够应用运算符 <、>、<=、> =、== 或!=,后跟版本标识符。当我的项目装置时会依据该配置来下载和装置依赖。

咱们须要 requirements.txt 和 setup.py/setup.cfg 文件吗?

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

  • 如果次要用于我的项目开发目标,并且不打算公布到 pypi 上,则 requirements.txt 就足够了(即便该包是在多台机器上开发的)
  • 如果包仅在单机开发,然而须要把他作为 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 文件。并且在大多数状况下,可能须要这两个文件同时存在,这样才可能正确治理包依赖和进行包的公布。

作者:Giorgos Myrianthous

退出移动版