MEP11:第三方依赖#
本 MEP 试图改进处理 matplotlib 中第三方依赖项的方式。
状态#
已完成——需要合并
分支和拉取请求#
#1157:使用自动依赖解析
#1290: 解包 pyparsing
#1261:将 6 更新到 1.2
摘要#
matplotlib 的目标之一是使其尽可能易于安装。为此,一些第三方依赖项包含在源代码树中,并在某些情况下与 matplotlib 一起安装。本 MEP 旨在解决该方法的一些问题,带来一些一致性,同时继续方便安装。
在最初完成时,setuptools、easy_install和 PyPI还不够成熟,无法依赖。但是,目前,我们应该能够安全地利用这些工具的“现代”版本,distribute和pip。
虽然 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:
当与pip一起使用时,这种行为最令人惊讶,因为没有 执行pip依赖关系解析,即使它可能适用于所有这些包。
据报道, pyparsing安装在 matplotlib 命名空间中的事实(#1290)让一些用户误以为它是一个与 matplotlib 相关的模块,并从那里而不是顶层导入它。
使用 Windows 安装程序安装时,dateutil、pytz和 六个都安装在顶层always,可能会覆盖这些库的已安装副本。
TODO:描述 OS-X 安装程序的行为。
当使用包管理器(Debian、RedHat、MacPorts 等)安装时,这种行为实际上是正确的,并且 matplotlib 包中没有特殊的补丁来处理我们以这种方式处理dateutil、pytz和6的事实. 但是,应注意,无论我们采取何种方法,都应在这种情况下继续发挥作用。
在 matplotlib 树中维护这些包并确保它们是最新的是一种维护负担。由于这种负担,可能需要第三方纯 Python 库的高级新功能具有更高的包含障碍。
期望的行为#
通过利用pip、distribute和PyPI从其规范位置下载和安装第三方依赖项。
dateutil、pytz和pyparsing应该成为可选依赖项——尽管如果不安装某些功能显然会失败。这将允许用户决定是否要安装特定功能。
实施#
对于从源代码安装,并假设用户拥有所有 C 级编译器和依赖项,这可以通过使用分发并按照此处的说明轻松完成。对 matplotlib 库代码的唯一预期更改是 从顶级命名空间而不是从 matplotlib中导入pyparsing 。请注意,distribute还允许我们删除对6的直接依赖,因为严格来说,它只是 dateutil的直接依赖。
对于二进制安装,有许多替代方案(此处从最佳/最难到最差/最容易排序):
distutils wininst 安装程序允许运行安装后脚本。有可能让这个脚本运行pip来安装其他依赖项。( 对于以前曾涉足该领域的人,请参阅此线程)。
继续在我们的安装程序中发布dateutil、pytz、6和pyparsing ,但只有在找不到它们时才使用 post-install-script 安装它们 。
将所有这些包移动到(新)
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