MEP11:第三方依赖#

本 MEP 试图改进处理 matplotlib 中第三方依赖项的方式。

状态#

已完成——需要合并

分支和拉取请求#

#1157:使用自动依赖解析

#1290: 解包 pyparsing

#1261:将 6 更新到 1.2

摘要#

matplotlib 的目标之一是使其尽可能易于安装。为此,一些第三方依赖项包含在源代码树中,并在某些情况下与 matplotlib 一起安装。本 MEP 旨在解决该方法的一些问题,带来一些一致性,同时继续方便安装。

在最初完成时,setuptoolseasy_installPyPI还不够成熟,无法依赖。但是,目前,我们应该能够安全地利用这些工具的“现代”版本,distributepip

虽然 matplotlib 依赖于 Python 库和 C/C++ 库,但此 MEP 仅针对 Python 库,以免混淆问题。C 库代表了一组更大且大部分正交的问题。

详细说明#

matplotlib 依赖于以下第三方 Python 库:

  • 麻木的

  • dateutil(纯 Python)

  • pytz(纯 Python)

  • 六 -- dateutil 需要(纯 Python)

  • pyparsing(纯 Python)

  • PIL(可选)

  • GUI 框架:pygtk、gobject、tkinter、PySide、PyQt4、wx(都是可选的,但交互式 GUI 需要一个)

当前行为#

从源代码安装时,git checkout 或pip

  • setup.py试图. 如果失败,则安装失败。import numpy

  • 对于dateutilpytzSix中的每一个,setup.py尝试导入它们(从顶级命名空间)。如果失败,matplotlib 将其库的本地副本安装到顶级命名空间中。

  • pyparsing始终安装在 matplotlib 命名空间内。

当与pip一起使用时,这种行为最令人惊讶,因为没有 执行pip依赖关系解析,即使它可能适用于所有这些包。

据报道, pyparsing安装在 matplotlib 命名空间中的事实(#1290)让一些用户误以为它是一个与 matplotlib 相关的模块,并从那里而不是顶层导入它。

使用 Windows 安装程序安装时,dateutilpytz六个都安装在顶层always,可能会覆盖这些库的已安装副本。

TODO:描述 OS-X 安装程序的行为。

当使用包管理器(Debian、RedHat、MacPorts 等)安装时,这种行为实际上是正确的,并且 matplotlib 包中没有特殊的补丁来处理我们以这种方式处理dateutilpytz6的事实. 但是,应注意,无论我们采取何种方法,都应在这种情况下继续发挥作用。

在 matplotlib 树中维护这些包并确保它们是最新的是一种维护负担。由于这种负担,可能需要第三方纯 Python 库的高级新功能具有更高的包含障碍。

期望的行为#

通过利用pipdistributePyPI从其规范位置下载和安装第三方依赖项。

dateutilpytzpyparsing应该成为可选依赖项——尽管如果不安装某些功能显然会失败。这将允许用户决定是否要安装特定功能。

实施#

对于从源代码安装,并假设用户拥有所有 C 级编译器和依赖项,这可以通过使用分发并按照此处的说明轻松完成。对 matplotlib 库代码的唯一预期更改是 从顶级命名空间而不是从 matplotlib中导入pyparsing 。请注意,distribute还允许我们删除对6的直接依赖,因为严格来说,它只是 dateutil的直接依赖。

对于二进制安装,有许多替代方案(此处从最佳/最难到最差/最容易排序):

  1. distutils wininst 安装程序允许运行安装后脚本。有可能让这个脚本运行pip来安装其他依赖项。( 对于以前曾涉足该领域的人,请参阅此线程)。

  2. 继续在我们的安装程序中发布dateutilpytz6pyparsing ,但只有在找不到它们时才使用 post-install-script 安装它们 。

  3. 将所有这些包移动到(新)matplotlib.extern 命名空间中,以便外部用户清楚这些是外部包。在核心 matplotlib 代码库中添加一些条件导入,以便首先尝试dateutil(在顶级),并matplotlib.extern.dateutil使用失败。

2 和 3 是不可取的,因为它们仍然需要在我们的树中维护这些包的副本——而且它们使用较少的事实加剧了这种情况——仅在二进制安装程序中。这 3 种方法都没有解决 Numpy,它仍然必须使用安装程序手动安装。

TODO:这与 Mac OS-X 安装程序有什么关系?

向后兼容性#

目前,matplotlib 可以在没有第三方依赖和没有互联网连接的机器上从源代码安装。在此更改之后,首次安装 matplotlib 将需要 Internet 连接(和有效的 PyPI)。(后续 matplotlib 更新或开发工作将在不访问网络的情况下运行)。

替代方案#

分发二进制鸡蛋感觉不是一个可用的解决方案。这需要先安装easy_install ,Windows 用户通常更喜欢开箱即用的知名安装程序.exe或安装程序。.msi