几年前,当我第一次发现Python的requirements。txt和虚拟环境时,说实话我感觉真的很棒。 requirements。txt文件是管理依赖项的一种非常有用的方法,但过了一段时间,当你拥有多个子依赖项的依赖项时,开始迷失在它们的关系中。 让我们通过一个简单的例子来解释使用它的主要问题。 你安装依赖项F,它恰好具有G作为子依赖项。一段时间后,在requirements。txt中看到的只是A、B、C、D、E、F、G、H作为你的依赖项。 你不知道直接或间接安装了哪些依赖项,因此现在更新甚至删除F成为一个问题,因为你必须搜索才能知道G是作为子依赖项安装的。即使搜索,可以删除G,还是其他包的子依赖项? 最终会留下陈旧的依赖项并堆积垃圾或花费大量时间进行完整搜索并删除所有未使用的内容。 这不是唯一的问题。如果你不够小心并且只是为了测试目的而安装了一个包,那也可能会永远出现在你项目的依赖项中。解决方案 为了解决这个问题,许多聪明人想出了更好的方法来管理Python中的依赖项。我们有piptools和poetry。 在本文中,我们将分享如何使用piptools的一个可靠示例,说明如何从项目开始就管理依赖项。 假设我们有一个项目,我们必须在其中使用Django和Pandas。1、安装piptools 首先,您需要在您将使用的每个virtualenv中安装piptools,但它就像使用一样简单:python3mvenvvenvsourcevenvbinactivatepipinstallpiptools2、创建requirements。in文件 现在,我们创建一个requirements。in文件,并且只包含我们项目的直接依赖项。每次想要更新或包含依赖项时,你都必须来到这里。它看起来像这样: 你能看出它与旧的。txt文件有何不同吗?在这一个中,我们只包括直接依赖项。您可以选择是否包含版本限制,如下所示: 3、编译你的需求 主要区别在于,这是从现在开始生成你的requirements。txt的秘诀。完成创建后,你可以运行以最终编译需求:pipcompile。requirements。in 这将在生成。in文件的同一文件夹中生成一个requirements。txt。但是你会发现他们两个之间有很大的不同。requirements。txt现在通过在它们下面附加该信息来精确控制某个包是否是其他包的子依赖项,如下所示: 就这样,您消除了之前讨论的所有问题。因为你拥有管理包裹所需的所有信息。4、额外功能 除此之外,piptools还提供了其他便利功能,你可以探索这些功能以使流程更加轻松。 要升级包,请使用以下命令(以Django为例):pipcompileupgradepackagedjango 这将自动更新你requirements。txt文件,包括这些更改。只需记住删除小于版本4的约束以允许它。 为了使你的virtualenv与当前的requirements。txt文件同步,可以简单地运行以下命令:pipsync 这将安装、升级或卸载您的requirements。txt文件中未包含的任何包。