再见 requirements.txt,Python 管理依赖项请用 pip

Python015

再见 requirements.txt,Python 管理依赖项请用 pip,第1张

几年前,当我第一次发现 Python 的 requirements.txt 和虚拟环境时,说实话我感觉真的很棒。

requirements.txt文件是管理依赖项的一种非常有用的方法,但过了一段时间,当你拥有多个子依赖项的依赖项时,开始迷失在它们的关系中。

让我们通过一个简单的例子来解释使用它的主要问题。

你安装依赖项 F,它恰好具有 G 作为子依赖项。一段时间后,在 requirements.txt 中看到的只是 A、B、C、D、E、F、G、H 作为你的依赖项。

你不知道直接或间接安装了哪些依赖项,因此现在更新甚至删除 F 成为一个问题,因为你必须搜索才能知道 G 是作为子依赖项安装的。即使搜索,可以删除 G,还是其他包的子依赖项?

最终会留下陈旧的依赖项并堆积垃圾或花费大量时间进行完整搜索并删除所有未使用的内容。

这不是唯一的问题。如果你不够小心并且只是为了测试目的而安装了一个包,那也可能会永远出现在你项目的依赖项中。

为了解决这个问题,许多聪明人想出了更好的方法来管理 Python 中的依赖项。我们有 pip-tools 和 poetry。

在本文中,我们将分享如何使用 pip-tools 的一个可靠示例,说明如何从项目开始就管理依赖项。

假设我们有一个项目,我们必须在其中使用 Django 和 Pandas。

首先,您需要在您将使用的每个 virtualenv 中安装 pip-tools,但它就像使用一样简单:

现在,我们创建一个 requirements.in 文件,并且只包含我们项目的直接依赖项。每次想要更新或包含依赖项时,你都必须来到这里。它看起来像这样:

你能看出它与旧的.txt文件有何不同吗?在这一个中,我们只包括直接依赖项。您可以选择是否包含版本限制,如下所示:

主要区别在于,这是从现在开始生成你的 requirements.txt 的秘诀。完成创建后,你可以运行以最终编译需求:

这将在生成 .in 文件的同一文件夹中生成一个 requirements.txt。但是你会发现他们两个之间有很大的不同。requirements.txt现在通过在它们下面附加该信息来精确控制某个包是否是其他包的子依赖项,如下所示:

就这样,您消除了之前讨论的所有问题。因为你拥有管理包裹所需的所有信息。

除此之外,pip-tools 还提供了其他便利功能,你可以 探索 这些功能以使流程更加轻松。

要升级包,请使用以下命令(以 Django 为例):

这将自动更新你 requirements.txt 文件,包括这些更改。只需记住删除"小于版本4"的约束以允许它。

为了使你的 virtualenv 与当前的 requirements.txt 文件同步,可以简单地运行以下命令:

这将安装、升级或卸载您的 requirements.txt 文件中未包含的任何包。

Virtual Environments

首先Python似乎没有类似Maven/Ant这样的项目管理工具。那么当一台机器上有多个python项目,且这些python项目各自有不同的依赖,不想互相干扰时怎么办呢?

官方做法是使用Virtual Environments将每个项目互相隔离开。一般情况下,我们使用python解释器运行python脚本或module:

>python myScript.py

运行的目录就是安装的python解释器,即python.exe所在的目录。而Virtual Environments就是给每个项目都生成一个项目独有的目录,这个目录里包含python解释器,python标准类库和其他各式各样的必要文件。这样每个项目就可以使用不同的解释器和类库,且互不干扰。

创建过程也很简单。首先找到pyvenv.py所在的目录,这个文件通常在安装目录的自目录\Tools\scripts下。这是一个生成Virtual Environments的工具。然后运行:

>pyvenv tutorial-env

运行后就会生成一个名为“tutorial-env”的目录。找到这个目录,可以发现正如官网所说,这个目录包含运行python项目所必须的一切文件。使用在各自Virtual Environments目录里包含的解释器来运行特定的python项目就可以了。同时,对于那些每个项目使用的特定的依赖(packages或module),则加入到各自Virtual Environments目录的类库子目录中就可以了。这里需要注意的是。创建完Virtual Environments后,还需要激活。做法很简单,在上例tutorial-env目录下执行下的命令即可:

>tutorial-env/Scripts/activate

PIP

PIP是官方提供的安装python第三方类库(packages/module)的工具。它可以去PPI(python packages index)查找或下载第三方类库。网址是:https://pypi.python.org/pypi

找到上例Virtual Environments目录下的pip.exe并运行:

>pip install lib_name

即可安装,其他功能请自行查看手册。如果是在python的安装目录下运行pip,则类库可以被非Virtual Environments的所有项目使用。PIP安装的其实是package。

Requirements.txt

在Virtual Environments目录下运行:

>pip freeze >requirements.txt

可以生产一个当前项目所有依赖类库及其版本的list文件,文件名就是requirements.txt(当然也可以用别的名字)。文件内容大致如下:

novas==3.1.1.3

numpy==1.9.2

requests==2.7.0

使用requirements.txt的好处就是:

The requirements.txt can then be committed to version control and shipped as part of an application. Users can then install all the necessary packages with “install -r“:

>pip install -r requirements.txt

这样就可以方便的管理项目依赖了。如果不使用requirements.txt,直接使用version control存储Virtual Environments目录,其他程序员直接下载该目录就可以开始项目开发的做法也可以。

Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。Python标准库的主要功能有:文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能。文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能。操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、日志等功能网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能。 网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架。W3C格式支持,包含HTML,SGML,XML的处理。其它功能,包括国际化支持、数学运算、HASH、Tkinter等。