MEP11:第三方依赖关系¶
该MEP试图改进Matplotlib中第三方依赖项的处理方式。
摘要¶
Matplotlib的目标之一是尽可能地使其易于安装。为此,源树中包含一些第三方依赖项,在某些情况下,这些依赖项与matplotlib一起安装。该MEP旨在通过这种方法解决一些问题,带来一些一致性,同时继续使安装更加方便。
在最初完成的时候, setuptools, easy_install 和 PyPI 还没有成熟到可以依靠的程度。但是,目前,我们应该能够安全地利用这些工具的“现代”版本, distribute 和 pip.
虽然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:
这种行为在与 pip, 因为没有 pip 即使依赖解析可能适用于所有这些包,也会执行依赖解析。
事实是 pyparsing 据报道,安装在matplotlib命名空间中的(1290)使一些用户感到困惑,认为它是matplotlib相关模块,并从该模块而不是顶层导入。
使用Windows Installer安装时, dateutil, pytz 和 six 安装在顶层 总是 ,可能会覆盖已安装的这些库的副本。
TODO:描述OS-X安装程序的行为。
当使用包管理器(debian、redhat、macports等)安装时,这种行为实际上是正确的,Matplotlib包中没有特殊的补丁来处理我们处理的事实 dateutil, pytz 和 six 这样。然而,应该注意的是,无论我们采取什么样的方法,都会在这种情况下继续工作。
在Matplotlib树中维护这些包并确保它们是最新的,这是维护负担。由于这种负担,可能需要第三方纯Python库的高级新特性具有更高的包含障碍。
实施¶
对于从源代码安装,并且假设用户拥有所有C级编译器和依赖项,使用 distribute 按照指示做 here . 对matplotlib库代码的唯一预期更改是导入 pyparsing 来自顶级命名空间,而不是Matplotlib中。注意 distribute 也将允许我们消除对 six, 因为严格地说,它只是 dateutil.
对于二进制安装,有许多备选方案(这里从最佳/最难到最差/最容易排序):
2和3是不受欢迎的,因为它们仍然需要在我们的树中维护这些包的副本——而且由于它们的使用较少,这一点更加恶化了——只在二进制安装程序中使用。这三种方法都没有接近地址numpy,仍然需要使用安装程序手动安装。
TODO:这与Mac OS-X安装程序有什么关系?
向后兼容性¶
目前,Matplotlib可以从源代码安装到一台没有第三方依赖关系和Internet连接的机器上。更改后,将需要一个Internet连接(和一个工作的PYPI)来首次安装Matplotlib。(后续Matplotlib更新或开发工作将在不访问网络的情况下运行)。
选择¶
分发二进制鸡蛋感觉不是一个可用的解决方案。那就需要 easy_install 首先安装,Windows用户通常更喜欢 .exe
或 .msi
开箱即用的安装程序。