管理Python依赖—你需要知道的一切

管理Python依赖—你需要知道的一切

在管理Python环境时,关键问题之一是依赖项管理。依赖项是项目按照预期工作并避免运行时错误所需的所有软件组件。

你可以指望PyPI (Python包索引)提供包,可以帮助您开始一切从数据操作到机器学习到web开发,等等。这可以节省大量的时间,但是解析所需的所有包之间的依赖关系也可能是巨大的时间消耗因为PIP目前不支持依赖性解析。Acti188bet金宝搏备用veState平台是目前唯一同时支持这两种技术的解决方案:

  • 依赖性解析-自动确保由包引入的所有依赖项都与Python环境的其余部分兼容。
  • 依赖冲突解决-当ActiveSta188bet金宝搏备用te平台不能自动解决依赖关系时,它会建议一个手动解决方案来解决冲突。

如果您在依赖关系冲突和解决方面遇到麻烦,请尝试ActiveState Platform188bet金宝搏备用注册一个免费账户

对于其他依赖关系管理问题,请继续阅读,了解如何:

  • 添加、删除和更新依赖项
  • 解决依赖关系冲突
  • 使用依赖项管理工具,如Virtualenv、Pyenv、Conda等,也尝试现代解决方案,如ActiveState的Platform

依赖地狱

“依赖地狱”是一个恰当的术语,用来描述在试图解决依赖冲突时可能经历的烦恼。当不同的Python包具有相同的依赖关系,但依赖于共享包的不同且不兼容的版本时,就会发生依赖冲突。因为在任何项目的环境中只允许依赖项的单个版本,所以找到一个兼容的解决方案可能会很困难。

即使在一个被隔离在虚拟环境中的项目中,也会出现传递依赖冲突。传递依赖关系是间接依赖关系,也称为依赖关系的依赖关系。例如,如果包A有依赖项B,而依赖项B有依赖项C,那么包A传递依赖项C。传递依赖项冲突的一个例子是多个包依赖于依赖项C的不同版本。

本文档的其余部分包含了帮助您的工具和策略管理依赖地狱,但唯一能完全避免的方法就是使用Active188bet金宝搏备用State平台,因为它是唯一能给你提供冲突最终解决方案的工具。有关ActiveState依赖项冲突解决过程的更多信息,请参阅依赖关系解决优化——ActiveState的方法。

管理Python依赖项的方法

总的来说,依赖项管理是最佳实践和彻底理解实现它们的工具链的结合。用于此目的的工具将在本页后面的管理依赖项的虚拟环境解决方案部分。

管理依赖项的最佳实践:

  • 确保您熟悉Python打包和Pip用户指南,以及与依赖规范和打包相关的pep。
  • 如果可能的话,从requirements.txt文件中安装依赖项,而不是单独安装。txt文件指定每个依赖项的有效版本,它们应该一起工作。如果您一次安装每个依赖项(特别是如果您没有指定版本),则包管理器将检索每个依赖项的最新版本,这将增加依赖项冲突的可能性。
  • 总是为每个项目创建一个单独的虚拟环境。这将隔离每个项目之间的依赖关系,以及将它们与全局安装的依赖关系隔离开来,减少冲突的机会。
  • 创建锁文件(例如pipfile.lock)可以确保依赖关系保持固定在使用的确切版本上,从而确保可重现性。
  • (可选)具有os级虚拟化的Docker容器,以及具有虚拟化软件/硬件架构的VMs (Virtual Machines),可以用来帮助确保软件应用程序之间的隔离,甚至比虚拟目录进程隔离更进一步。

管理和添加依赖到Python项目

有许多不同的依赖项管理工具和方法可以管理并向Python项目添加依赖项,从pip到Conda再到ActiveState Platform。188bet金宝搏备用下面是一些最流行的依赖项管理工具的总结。

皮普

Pip是事实上的标准工具,用于安装Python包和管理它们的依赖关系。当你使用pip安装包时,它会自动从Python包索引(PyPI)中检索包及其所有依赖项,并将它们安装在你的系统本地:

美元pip安装< packagename >

不幸的是,pip没有尝试解决依赖冲突。例如,如果您安装了两个包,那么包A所需要的依赖项版本可能与包B所需要的不同。

Pip可以从源分发版(sdist)或Wheel (.whl)文件进行安装。Wheels是一种二进制可安装格式,包含包及其依赖项。如果sdisk和wheel格式在PyPI上都可用,pip将更喜欢一个兼容的wheel。如果pip没有找到一个轮子来安装,它将自动构建一个轮子并为您安装它。

有关pip的更多信息,请参阅使用Pip进行依赖管理,Python的包管理器

Setuptools

Setuptools是一个包开发过程库,是一种流行的长期标准,用于确保将项目与运行所需的所有依赖项打包在一起。依赖项定义在install_requires部分的setup.py文件,并与需要它们的包一起自动安装。不幸的是,只有这个方法会如果包需要在相同的环境中共享依赖项,防止产生冲突。

简单地说,pip和setuptools在依赖关系冲突方面有类似的限制。因此,需要更高级的工具和方法来管理依赖关系,如虚拟环境和锁文件。

有关setuptools的更多信息,请参阅如何打包用于发布的Python依赖项

PipDepTree

Pipdeptree是一个工具,用于以更直观的依赖树形式显示已安装的Python包。这在试图可视化依赖关系冲突时非常有用。然而,Pipdeptree不安装包和依赖项,也不提供冲突解决方案。

当您需要帮助时,可以使用Pipdeptree使环境中的包和依赖关系的层次结构更易于理解。它可以用来显示全局安装的包,也可以显示在虚拟环境中安装的包。

有关使用PipDepTree的更多信息,请参阅如何检查Python依赖关系

Pipreqs

Pipreqs是一个工具,它可以生成一个requirements.txt文件,其中包含项目依赖项的列表,以及基于它在源代码中检测到的导入的版本。

Pipreqs用法

要安装pipreqs,输入:

$ PIP安装pipreqs

要为项目生成一个requirements.txt文件,并将其保存到项目位置,输入:

pipreqs美元/< projectlocation >#让pkginfo = = 1.5.0.1汇总= = 0.8.7structlog = = 20.1.0...

管理依赖项的虚拟环境解决方案

Virtualenv和Venv

Virtualenv是一个低级工具,最初来自Python 2,用于在虚拟环境中隔离多个项目,最大限度地减少依赖冲突的可能性。

在Python 3中,可以使用VirtualEnv和Venv一起创建虚拟环境。Venv和VirtualEnv类似,但是Venv(不像VirtualEnv)包含在Python 3.3+中,不需要安装。

注意,在Python 3.8中,Virtualenv已被弃用,取而代之的是Venv.Venv是一种比Pipenv级别更低的工具,下一节将对此进行描述,当Pipenv不能满足您的需求时,它会很有用。

Pipenv

Pipenv是一个依赖管理器,它将Pip和Virtualenv集成到一个应用程序中。它可以用于为每个项目创建虚拟环境,并自动管理每个项目中的依赖项。

Pyenv

Pyenv是一个Python版本管理器,用于更改全局Python版本、安装多个Python版本、设置特定于项目的Python版本以及创建和管理虚拟环境。

请注意Pyenv是一个Bash扩展,不能在Linux的Windows子系统之外的Windows上工作。

要了解更多信息,请参考Virtualenv、Venv、Pipenv和Pyenv如何使用虚拟环境管理Python依赖关系

可供选择的Python包管理器

Python生态系统提供了许多第三方包管理器,它们认识到当前解决方案在解决依赖项时的局限性。所有这些替代方案都与PyPI兼容,但是尝试在依赖关系冲突发生之前解决它们(例如。,在安装时)。

188bet金宝搏备用

Acti188bet金宝搏备用veState平台允许您自动从项目的源代码构建Python运行时环境。运行时包括特定版本的Python,以及项目所需的所有包及其依赖项(包括链接的C库)。

Platform的Solver组件在可能的情况下自动解决所有依赖关系,并标记不可解决的冲突,因此您可以通过简单地遵循提供的说明来手动解决它们。

Python依赖项管理方向

一旦为Linux、Windows或macOS构建并打包了项目的运行时,就可以使用State Tool CLI将其自动安装到虚拟环境中,从而使其与其他项目/全局安装保持隔离。此外,ActiveState平台为188bet金宝搏备用您提供了一种方法将安全性写入您的语言构建中,每次运行应用程序时识别安全漏洞、过期包和限制性许可。

有关ActiveState平台的更多信息,请参阅188bet金宝搏备用188bet金宝搏备用ActiveState平台网页

诗歌

Poetry是一个Python包和依赖项管理工具,它提供了开箱即用的依赖项解析。项目依赖项在pyproject中管理。Toml文件,当诗歌安装命令运行。

请注意尽管Poetry默认从PyPI安装包,但它们并不包含setup . py和不相容的皮普.诗歌做的事情不同。

有关诗歌的更多信息,请参阅如何使用Python依赖项管理工具

Conda

Conda是一个用于Anaconda Python的包、依赖项和环境管理工具。它的一些基本特性类似于Pip、Virtualenv和Venv。然而,它是一个单独的、增强的工具,设计用于仅在Conda环境中工作。

Conda是一个命令行工具,包含在Anaconda Python发行版中,可以在Windows或Linux终端的Anaconda Prompt中运行。使用Conda通常比使用Anaconda Navigator GUI(图形用户界面)更快更实用,后者在功能上很相似。

Conda不仅提供虚拟环境,隔离或沙箱每个项目,以防止它们之间的依赖冲突;它分析每个包的兼容依赖项和安装期间的潜在冲突。如果有冲突,Conda将通知或标记您无法完成安装。

有关康达的更多信息,请参阅如何使用Conda管理Python依赖关系

Python中有几种不同的处理依赖关系的方法。许多生态系统都有固定软件包版本和只进行受控升级的工具,但这些工具也有自己的缺点。如果你的构建不仅仅是基于语言呢?有一个用户友好的系统来管理您的依赖关系不是很好吗?

管理依赖关系的一种解决方案是188bet金宝搏备用,它可以自动解析项目的所有依赖项,并将它们(包、依赖项和子依赖项)编译为您使用的操作系统的运行时。每次更新包或依赖项时,188bet金宝搏备用可以重新构建运行时,同时确保所有依赖项和子依赖项之间的兼容性。今天就试试吧!

雷米米