在Mac OS X上,框架和Python的非框架构build之间的差异

在Mac OS X上,Framework构build和Python的非构build(即,标准UNIX构build)Python之间有什么区别? 另外,每个的优点和缺点是什么?

初步研究

以下是发布此问题之前发现的信息:

  • [Pythonmac-SIG]为什么需要Python的Framework构build
    • B. Grainger:“我似乎还记得,如果你想用本地Mac GUI做任何事情,就需要Python的Framework构build,我的理解是正确的吗?
    • C. Barker:“非常多 – 要访问Mac GUI,一个应用程序需要在一个正确的Mac应用程序包中。
  • Apple开发人员连接:框架定义
    • “框架是一个包(一个结构化的目录),它包含一个dynamic共享库以及关联的资源,例如nib文件,图像文件和头文件。开发应用程序时,项目链接到一个或多个框架。例如,iPhone应用程序项目默认链接到Foundation,UIKit和Core Graphics框架,您的代码通过由框架通过其头文件发布的应用程序编程接口(API)来访问框架的function,是dynamic共享的,多个应用程序可以同时访问框架代码和资源,系统根据需要将框架的代码和资源加载到内存中,并在所有应用程序之间共享资源的一个副本。
  • 框架编程指南:什么是框架?
    • “与静态链接库和其他types的dynamic共享库相比,框架提供了以下优点:
      • 框架组相关,但分开,资源在一起。 这个分组使得安装,卸载和定位这些资源更加容易。
      • 框架可以包含比库更多的资源types。 例如,一个框架可以包含任何相关的头文件和文档。 同一个包中可以包含多个版本的框架。 这使得可以向后兼容较旧的程序。
      • 无论有多less进程正在使用这些资源,只有一个框架只读资源的副本在任何给定的时间都驻留在内存中。 这种资源共享减less了系统的内存占用,并有助于提高性能。“

背景

在使用Mac OS X 10.6 Snow Leopard之前,我对此没有太多的了解,因为我只是简单地下载并安装Python 2.6.2 Mac Installer Disk Image (这是一个框架构build),并使用virtualenv,pip等等。然而,随着Snow Leopard到64位,gcc等等的变化,我注意到一些问题,使我想从源代码编译/编译Python 2.6.2+,这导致我到我的将Python构build为MacOSX | Darwin框架的差异和优缺点的问题。

您已经列出了构build框架的所有重要优势(祝贺您的优秀研究和报告!); 唯一不利的一面就是很难安排一个正确的构build,但是如果你从你引用的安装程序中的例子中找出你的线索,应该是可行的。

顺便说一句,Snow Leopard自带的系统Python有什么问题? 我还没有从豹升级(长话短说……我有“家庭执照”升级DVD,但需要雪豹修复一些东西才能升级),所以我还没有第一手的经验,但我知道这是一个2.6版本,它有32位和64位版本…所以你为什么需要build立自己的框架?

还有一个区别:通常安装程序从python.org提供的Framework安装有几个体系结构。

$ file libpython2.7.dylib

libpython2.7.dylib: Mach-O universal binary with 2 architectures libpython2.7.dylib (for architecture i386): Mach-O dynamically linked shared library i386 libpython2.7.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64

如果你从源代码安装,而不是故意改变它,你的libpython只有一个体系结构。 我曾遇到两种架构实际上导致问题的情况(至less我相信这是原因),即在安装HDF5 python绑定(h5py)时。

还有一个区别:有些工具需要安装框架。 比如PyQt,尤其是sip。 虽然可以安装sip和PyQt,甚至是python的非框架版本,但是它要复杂得多。

至于决定什么偏好,我还是不知道。 此刻,我去了非框架选项,但我必须说,这也使我感到头痛。

如果你要运行你的代码(让它运行在另一台机器上),你最好使用系统版本的python,否则你的程序在其他机器上的行为将是未定义的。

我在10.6上使用Macports ,这使得安装Python的多个版本并在它们和Apple的版本之间切换变得非常简单:

 sudo port install python26 sudo port install python_select sudo python_select -l 

python26的最新版本是2.6.2,在10.6.1上编译和运行良好:trac.macports.org/browser/trunk/dports/lang/python26/Portfile

在安装时,Framework构build由“根”帐户拥有。 源版本将由安装它的帐户拥有。 拥有Python安装的优势(和缺点)是您不需要更改帐户来修改它。

一个小的区别是Framework构build是针对EditLine库构build的。 源代码编译通常是针对Readline库编译的。 根据Python编译的库,标准库中的readline模块的工作原理略有不同。 有关更多详细信息,请参阅Mac OS X上的“man python”。

这里有一个很好的扩展,用于在Mac OS X上自动从源代码编译Python 2.4,2.5和2.6。 这将根据readline的自定义构build进行编译。 但是,编写源代码安装脚本的用处在于,您可以对自定义Python构build进行额外的调整,例如安装基本发行版(如virtualenv),或者更难安装发行版(如PIL)。