Mac OS X上的Python和非框架构建之间的差异

时间:2009-09-18 13:27:55

标签: python macos frameworks

问题

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

初步研究

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

  • [Pythonmac-SIG] Why is Framework build of Python needed
    • B中。 Grainger:“我似乎记得,如果你想用原生的Mac GUI做任何事情,就需要一个Python的Framework构建。我的理解是否正确?”
    • ℃。 Barker:“非常多 - 要访问Mac GUI,应用程序需要在适当的Mac应用程序包中。框架构建提供了这个。”
  • Apple Developer Connection: Framework Definition
    • “框架是一个包(结构化目录),它包含动态共享库以及相关资源,例如nib文件,图像文件和头文件。当您开发应用程序时,您的项目链接到一个或多个例如,iPhone应用程序项目默认链接到Foundation,UIKit和Core Graphics框架。您的代码通过应用程序编程接口(API)访问框架的功能,API由框架通过其头文件发布。由于库是动态共享的,因此多个应用程序可以同时访问框架代码和资源。系统根据需要将框架的代码和资源加载到内存中,并在所有应用程序之间共享资源的一个副本。“
  • Framework Programming Guide: What are Frameworks?
    • “与静态链接库和其他类型的动态共享库相比,Frameworks具有以下优势:
      • 框架组相关,但是将资源分开。通过此分组,可以更轻松地安装,卸载和定位这些资源。
      • 框架可以包含比库更多种资源类型。例如,框架可以包含任何相关的头文件和文档。 框架的多个版本可以包含在同一个包中。这使得可以向后兼容旧程序。
      • 在任何给定时间,只有一个框架的只读资源副本驻留在内存中,无论有多少进程正在使用这些资源。这种资源共享减少了系统的内存占用,并有助于提高性能。“

背景

在Mac OS X 10.6 Snow Leopard之前,我没有考虑过这个,因为我只是下载并安装Python 2.6.2 Mac Installer Disk Image,这是一个框架构建,并使用virtualenv,pip继续我的业务但是,随着Snow Leopard到64位,gcc等的变化,我注意到一些问题让我想要从源代码构建/编译Python 2.6.2+,这导致我进入了关于将Python构建为MacOSX | Darwin框架的差异和优缺点的问题。

5 个答案:

答案 0 :(得分:13)

您已经列出了制作框架的所有重要优势(祝贺优秀的研究和报告!);唯一的另一面是,你很难安排正确地构建一个,但是如果你从你引用的安装程序中的示例中获取线索,它应该是可行的。

顺便说一下,Snow Leopard附带的系统Python出了什么问题?我还没有从Leopard升级(长篇大论......我确实有“家庭许可证”升级DVD,但在升级之前需要Snow Leopard修复一些东西),所以我还没有第一手经验,但我知道它是一个2.6版本,它有32位和64位版本......所以为什么你需要构建自己的框架?

答案 1 :(得分:4)

还有另一个不同之处:安装程序从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只有一个架构。 我遇到过这两种架构实际上导致问题的情况(至少我相信这就是原因),即安装HDF5 python绑定(h5py)时。

还有另一个不同之处:某些工具需要框架安装。例如PyQt,特别是sip。虽然即使对于python的非框架版本也可以安装sip和PyQt,但它要复杂得多。

至于决定更喜欢什么,我还是不知道。目前,我选择了非框架选项,但我必须说,这也让我头疼。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我在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

答案 4 :(得分:0)

框架构建在安装时由“root”帐户拥有。源构建将由安装它的帐户拥有。拥有Python安装的优点(和缺点)是您不需要更改帐户来修改它。

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

有一个很好的构建可以自动从Mac OS X上的源代码编译Python 2.4,2.5和2.6,即explained here。这将针对自定义构建的readline进行编译。但是,编写源安装脚本的有用之处在于,您可以对自定义Python构建进行额外的调整,例如:安装必要的发行版,如virtualenv,或更难安装PIL等发行版。