用于处理 Python 包的 Pip 与包管理器

mas*_*mas 29 pacman python apt package-management pip

Python 包经常托管在许多发行版的存储库中。阅读教程后,特别是标题为“您真的想这样做吗”的部分后,我避免使用 pip 并更喜欢使用系统存储库,仅在需要安装不在存储库中的软件包时才使用 pip。

但是,因为这是一种不一致的安装方法,所以只使用pip会更好吗?对于在两个地方都可用的软件包,在系统自己的存储库上使用 pip 有什么好处/批评者?

我包含的链接状态

始终使用标准 Debian / NeuroDebian 软件包的优势在于,这些软件包都经过仔细测试以确保彼此兼容。Debian 软件包记录了与其他库的依赖关系,因此您将始终获得所需的库作为安装的一部分。

我用拱。除了 apt 之外,其他包管理系统也是这种情况吗?

Ste*_*itt 27

我发现使用pip在您的系统上安装 Python 模块的最大缺点,无论是作为系统模块还是作为用户模块,是您的发行版的包管理系统不会知道它们。这意味着它们不会用于需要它们的任何其他软件包,并且您将来可能想要安装它们(或者可能会在升级后开始使用这些模块之一);然后你最终会pip得到模块的 - 和分发管理版本,这可能会导致问题(我最近遇到了另一个例子)。所以你的问题最终成为一个全有或全无的命题:如果你使用pip 对于 Python 模块,您不能再将发行版的包管理器用于任何想要使用 Python 模块的东西...

您链接到的页面中给出的一般建议非常好:尽量使用您的发行版的软件包,仅pip用于未打包的模块,并且当您这样做时,请在您的用户设置中而不是在系统中这样做-宽的。尽可能使用虚拟环境,尤其是模块开发。尤其是在 Arch 上,你不应该遇到由旧模块引起的问题;即使在可能存在问题的发行版上,虚拟环境也很容易处理。

始终值得考虑的是,发行版的库和模块包主要是为了在发行版中使用其他包而打包的;使用这些库和模块进行开发是一个很好的副作用,但这不是主要用例。


das*_*s-g 11

TL; 博士

  • pip(+ virtualenv) 用于您的项目(您开发的)使用的东西(库、框架、也许是开发工具)
  • 将包管理器用于使用的应用程序(作为最终用户)

开发依赖

如果您正在用 Python 开发软件,您将希望pip用于项目的所有依赖项,无论它们是运行时依赖项、构建时依赖项还是自动化测试和自动合规性检查所需的东西(linter、样式检查器、静态类型检查器) ...)

有几个原因:

  • 这允许您使用virtualenv(直接或通过 virtualenvwrapper 或 pipenv 或其他方式)将不同项目的依赖项彼此分离,并将您“在生产中”(作为用户)使用的 Python 应用程序与任何奇异的恶作剧(或甚至只是不兼容),这可能会在开发中继续进行。
  • 这允许您在requirements.txt(如果您的项目是应用程序)或setup.py(如果您的项目是库或框架)文件中跟踪项目的所有依赖项。这可以与源代码一起检入修订控制(例如 Git),以便您始终知道哪个版本的代码依赖于您的依赖项的哪个版本。
  • 以上使其他开发人员可以在您的项目上进行协作,即使他们不使用相同的 Linux 发行版甚至不同的操作系统(如果使用的依赖项在 Mac 和 Windows 或他们碰巧使用的任何东西上也可用,即)
  • 您不希望操作系统包管理器的自动更新破坏您的代码。您应该更新您的依赖项,但您应该有意识地并且在您选择的时间这样做,以便您可以准备好修复您的代码或回滚更新。(如果您在版本控制系统中跟踪完整的依赖声明以及您的代码,这很容易。)

如果您觉得需要分离直接和间接依赖项(或区分依赖项的可接受版本范围和使用的实际版本,参见“版本固定”),请查看 pip-tools 和/或 pipenv。这也将允许您区分构建和测试依赖项。(构建和运行时依赖之间的区别大概可以用 编码setup.py

您使用的应用程序

对于您用作普通应用程序并且恰好是用 Python 编写的东西,更喜欢您的操作系统的包管理器。它将确保它保持合理的最新状态并与包管理器安装的其他东西兼容。大多数 Linux 发行版还会断言它们不分发任何恶意软件。

如果您的发行版的默认包存储库中没有您需要的东西,您可以查看其他包存储库(例如基于 deb 的发行版的启动板)或pip无论如何使用。如果是后者,请用于--user安装到用户的家中而不是系统范围内,这样您就不太可能破坏 Python 安装。(对于您暂时或很少需要的东西,您甚至可以使用 virtualenv。)


小智 10

使用包管理器的另一个原因是将自动应用更新,这对安全性至关重要。想想如果 Equifax 使用的 beans 包是通过 yum-cron-security 自动更新的,那么黑客可能就不会发生。

在我的个人开发箱上我使用 Pip,在生产中我使用包。

  • 您使用的还应该取决于您的生产设置。Virtualenvs 的存在是有原因的 :) 此外,根据您的发行版,安全更新实际上可能是坚持使用 pip 的原因,因为包管理器添加新版本的速度可能很慢。 (4认同)

小智 7

如果我们谈论安装 Python 包以在您编写的代码中使用,请使用 pip。

对于您正在处理的每个项目,创建一个虚拟环境,然后仅使用 pip 安装该项目所需的东西。这样,您以一致的方式安装您使用的所有库,并且它们被包含在内并且不会干扰您通过包管理器安装的任何内容。

如果您打算发布任何 python 代码,通常,您将添加一个setup.pyrequirements.txt到您的项目,这将允许 pip 自动获取它的所有依赖项。允许您轻松地为该项目创建或重新创建虚拟环境。