Mac OS X上Python框架版与非框架版的区别
问题
在Mac OS X上,Python的框架构建和非框架构建(也就是标准的UNIX构建)有什么区别?每种方式的优缺点又是什么呢?
初步研究
在我提出这个问题之前,我找到了一些信息:
- [Pythonmac-SIG] 为什么需要Python的框架构建
- B. Grainger: "我记得如果想用原生的Mac图形界面,Python的框架构建是必须的。我理解得对吗?"
- C. Barker: "基本上是的——要访问Mac的图形界面,应用程序需要在一个合适的Mac应用程序包里。框架构建提供了这个功能。"
- 苹果开发者连接:框架定义
- "框架是一个包含动态共享库和相关资源(比如nib文件、图像文件和头文件)的包(一个结构化的目录)。当你开发一个应用程序时,你的项目会链接到一个或多个框架。例如,iPhone应用项目默认链接到Foundation、UIKit和Core Graphics框架。你的代码通过框架的头文件访问框架的功能。因为这个库是动态共享的,多个应用可以同时访问框架的代码和资源。系统会根据需要将框架的代码和资源加载到内存中,并在所有应用之间共享同一份资源。"
- 框架编程指南:什么是框架?
- "框架相比静态链接库和其他类型的动态共享库有以下优点:
- 框架将相关但独立的资源组合在一起。这种组合使得安装、卸载和定位这些资源变得更简单。
- 框架可以包含比库更广泛的资源类型。例如,框架可以包括任何相关的头文件和文档。多个版本的框架可以包含在同一个包中,这样可以与旧程序保持向后兼容。
- 在任何时候,框架的只读资源在内存中只存在一份,无论有多少个进程在使用这些资源。这种资源共享减少了系统的内存占用,并有助于提高性能。
- "框架相比静态链接库和其他类型的动态共享库有以下优点:
背景
在Mac OS X 10.6 Snow Leopard之前,我对此并没有太多思考,因为我只是下载并安装了Python 2.6.2 Mac安装程序镜像,这就是一个框架构建,然后就开始使用virtualenv、pip等工具了。然而,随着Snow Leopard对64位、gcc等的改变,我注意到了一些问题,这让我想自己从源代码构建/编译Python 2.6.2以上的版本,这也引出了我对在MacOSX|Darwin框架下构建Python的区别和优缺点的疑问。
5 个回答
如果你打算把你的代码发出去(让它在其他机器上运行),最好使用系统自带的Python版本。否则,你的程序在其他机器上的表现可能会不稳定,甚至出错。
还有一个不同之处:通常从python.org下载的安装程序提供的框架安装包含多个架构。
$ file libpython2.7.dylib
libpython2.7.dylib: Mach-O 通用二进制文件,包含2个架构
libpython2.7.dylib(适用于架构 i386):Mach-O 动态链接共享库 i386
libpython2.7.dylib(适用于架构 x86_64):Mach-O 64位动态链接共享库 x86_64
如果你是从源代码安装的,并且没有特别去改动,那么你的libpython只有一个架构。我遇到过一些情况,这两个架构实际上导致了问题(至少我认为这是原因),比如在安装HDF5的Python绑定(h5py)时。
还有另一个不同之处:有些工具需要框架安装。例如PyQt,特别是sip。虽然即使是在非框架版本的Python中也可以安装sip和PyQt,但这要复杂得多。
至于选择哪个更好,我现在还不确定。目前我选择了非框架的选项,但我得说,这也让我遇到了一些麻烦。
你已经列出了制作一个框架的所有重要优点(恭喜你做了很棒的研究和报告!);唯一的缺点就是要正确地搭建一个框架比较难。不过,如果你参考你提到的安装程序中的例子,应该是可以做到的。
顺便问一下,Snow Leopard自带的系统Python有什么问题吗?我还没有从Leopard升级(这有点复杂...我确实有“家庭许可证”的升级DVD,但需要先用Snow Leopard修复一些东西才能升级),所以我还没有亲身体验过。不过我知道它是2.6版本,并且有32位和64位两个版本...那你为什么需要自己构建一个框架呢?