【问题标题】:Differences between Framework and non-Framework builds of Python on Mac OS XMac OS X 上 Python 的框架和非框架构建之间的差异
【发布时间】:2010-11-29 11:52:57
【问题描述】:

问题

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

初步研究

这是我在发布此问题之前找到的信息:

  • [Pythonmac-SIG] Why is Framework build of Python needed
    • 乙。 Grainger:“我似乎记得,如果你想用原生 Mac GUI 做任何事情,就需要一个 Python 框架构建。我的理解正确吗?”
    • C. Barker:“几乎——要访问 Mac GUI,应用程序需要位于适当的 Mac 应用程序包中。框架构建提供了这一点。”
  • Apple Developer Connection: Framework Definition
    • “框架是一个包(结构化目录),其中包含动态共享库以及相关资源,例如 nib 文件、图像文件和头文件。当您开发应用程序时,您的项目会链接到一个或多个框架。例如,iPhone 应用程序项目默认链接到 Foundation、UIKit 和 Core Graphics 框架。您的代码通过应用程序编程接口 (API) 访问框架的功能,该 API 由框架通过其头文件发布。由于库是动态共享的,因此多个应用程序可以同时访问框架代码和资源。系统根据需要将框架的代码和资源加载到内存中,并在所有应用程序之间共享一个资源的副本。”
  • Framework Programming Guide: What are 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 框架的区别和优缺点。

【问题讨论】:

  • 对于使用 Homebrew 的读者,您可以使用 brew install python --framework 安装框架构建。

标签: python macos frameworks


【解决方案1】:

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

BTW,Snow Leopard 自带的系统 Python 出了什么问题?我还没有从 Leopard 升级(长话短说……我确实有“家庭许可证”升级 DVD,但需要 Snow Leopard 修复一些东西才能升级),所以我还没有第一手经验,但我知道它是 2.6 版本,并且有 32 位和 64 位版本……那么为什么需要构建自己的框架?

【讨论】:

  • 雪豹自带的系统Python是Python 2.6.1。我更喜欢运行 2.6.2 以获得各种修复。
【解决方案2】:

还有另一个区别:python.org 的安装程序提供的框架安装通常具有多种架构。

$ 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,但要复杂得多。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 其实这样是不对的。如果你想以 app bundle 的形式发布你的代码(通过 py2app),你应该使用 Python.org 的框架版本,这样你就不会被绑定到特定版本的 OS X。所有 Python.org构建与 >= 10.4 兼容。
    【解决方案4】:

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

    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

    【讨论】:

      【解决方案5】:

      框架构建在安装时归“root”帐户所有。源构建将由安装它的帐户拥有。拥有 Python 安装所有权的优点(和缺点)是您无需更改帐户即可对其进行修改。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-15
        • 2010-11-20
        • 2012-01-04
        • 2011-09-28
        • 1970-01-01
        相关资源
        最近更新 更多