MEP11:第三方依赖关系

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

状态

完整的 --需要合并

分支和请求

#1157:使用自动依赖解析

#1290:揭穿pyparsing

#1261:更新6至1.2

摘要

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

在最初完成的时候, setuptools, easy_installPyPI 还没有成熟到可以依靠的程度。但是,目前,我们应该能够安全地利用这些工具的“现代”版本, distributepip.

虽然MatPuttLB对Python库和C/C++库都有依赖性,但该MEP只对Python库进行了处理,以免混淆该问题。C库代表了一组更大的且大部分是正交的问题。

详细描述

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

  • Numpy
  • dateutil(纯python)
  • Pytz(纯 Python )
  • 六——由dateutil(纯python)要求
  • pyparsing(纯python)
  • (可选)
  • 图形用户界面框架:Pygtk、Gobject、Tkinter、Pyside、Pyqt4、WX(所有可选,但交互式图形用户界面需要一个)

当前行为

从源安装时,A git 结帐或 pip:

  • setup.py 尝试 import numpy . 如果失败,则安装失败。
  • 对于每一个 dateutil, pytzsix, setup.py 尝试导入它们(从顶级命名空间)。如果失败,Matplotlib会将其库的本地副本安装到顶级命名空间中。
  • pyparsing 始终安装在Matplotlib命名空间内。

这种行为在与 pip, 因为没有 pip 即使依赖解析可能适用于所有这些包,也会执行依赖解析。

事实是 pyparsing 据报道,安装在matplotlib命名空间中的(1290)使一些用户感到困惑,认为它是matplotlib相关模块,并从该模块而不是顶层导入。

使用Windows Installer安装时, dateutil, pytzsix 安装在顶层 总是 ,可能会覆盖已安装的这些库的副本。

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

当使用包管理器(debian、redhat、macports等)安装时,这种行为实际上是正确的,Matplotlib包中没有特殊的补丁来处理我们处理的事实 dateutil, pytzsix 这样。然而,应该注意的是,无论我们采取什么样的方法,都会在这种情况下继续工作。

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

期望行为

第三方依赖项通过利用从其规范位置下载和安装 pip, distributePyPI.

dateutil, pytz, 和 pyparsing 应该成为可选的依赖项——但是很明显,如果没有安装某些功能,它们将失败。这将允许用户决定是否需要安装特定功能。

实施

对于从源代码安装,并且假设用户拥有所有C级编译器和依赖项,使用 distribute 按照指示做 here . 对matplotlib库代码的唯一预期更改是导入 pyparsing 来自顶级命名空间,而不是Matplotlib中。注意 distribute 也将允许我们消除对 six, 因为严格地说,它只是 dateutil.

对于二进制安装,有许多备选方案(这里从最佳/最难到最差/最容易排序):

  1. distutils wininst安装程序允许运行安装后脚本。可能可以运行此脚本 pip 安装其他依赖项。(见 this thread 因为有人曾经踏过那片土地)。
  2. 继续发货 dateutil, pytz, sixpyparsing 在我们的安装程序中,但是使用安装后脚本来安装它们 only 如果还没有找到。
  3. 将所有这些包移入(新) matplotlib.extern 因此,对于外部用户来说,这些是外部包是很明显的。在核心Matplotlib代码库中添加一些条件导入,以便 dateutil (在顶层)先尝试,但失败了 matplotlib.extern.dateutil 使用。

2和3是不受欢迎的,因为它们仍然需要在我们的树中维护这些包的副本——而且由于它们的使用较少,这一点更加恶化了——只在二进制安装程序中使用。这三种方法都没有接近地址numpy,仍然需要使用安装程序手动安装。

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

向后兼容性

目前,Matplotlib可以从源代码安装到一台没有第三方依赖关系和Internet连接的机器上。更改后,将需要一个Internet连接(和一个工作的PYPI)来首次安装Matplotlib。(后续Matplotlib更新或开发工作将在不访问网络的情况下运行)。

选择

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