代码之家  ›  专栏  ›  技术社区  ›  Matthew Rankin val

MacOSX上的python框架和非框架构建的区别

  •  47
  • Matthew Rankin val  · 技术社区  · 15 年前

    问题

    Mac OS X上的python框架构建和非框架构建(即标准的Unix构建)有什么区别?另外,它们的优点和缺点是什么?

    初步研究

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

    • [Pythonmac-SIG] Why is Framework build of Python needed
      • grainger:“我似乎记得,如果您想对本机mac gui做任何事情,就需要一个python框架构建。我的理解正确吗?”
      • 巴克:“几乎——要访问mac gui,应用程序需要在适当的mac应用程序包中。框架构建提供了这一点。”
    • Apple Developer Connection: Framework Definition
      • “框架是一个捆绑包(结构化目录),它包含一个动态共享库以及相关资源,如NIB文件、图像文件和头文件。开发应用程序时,项目链接到一个或多个框架。例如,默认情况下,iPhone应用程序项目链接到基础、UIKIT和核心图形框架。您的代码通过应用程序编程接口(API)访问框架的功能,该接口由框架通过其头文件发布。因为库是动态共享的,所以多个应用程序可以同时访问框架代码和资源。系统根据需要将框架的代码和资源加载到内存中,并在所有应用程序之间共享资源的一个副本。”
    • Framework Programming Guide: What are Frameworks?
      • “与静态链接库和其他类型的动态共享库相比,框架具有以下优势:
        • 框架将相关但独立的资源分组在一起。此分组使安装、卸载和定位这些资源变得更加容易。
        • 框架可以包含比库更广泛的资源类型。例如,框架可以包括任何相关的头文件和文档。 一个框架的多个版本可以包含在同一个包中。这使得向后兼容旧程序成为可能。
        • 无论有多少进程在使用这些资源,在任何给定的时间内,只有一个框架只读资源的副本物理上驻留在内存中。这种资源共享减少了系统的内存占用,并有助于提高性能。”

    背景

    在Mac OS X 10.6 Snow Leopard之前,我没有考虑过这个问题,因为我只需要下载并安装 Python 2.6.2 Mac Installer Disk Image 这是一个框架构建,使用virtualenv、pip等来开展我的业务。但是,随着SnowLeopard到64位、gcc等的变化,我注意到了一些问题,这些问题使我想从源代码构建/编译python 2.6.2+,这导致了我对将python构建为一个Acosx达尔文框架。

    5 回复  |  直到 12 年前
        1
  •  13
  •   Alex Martelli    15 年前

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

    顺便问一下,雪豹附带的系统python有什么问题?我还没有从豹升级(说来话长…我有“家庭许可证”升级DVD,但在升级之前需要雪豹修复一些东西),所以我还没有第一手的经验,但我知道这是一个2.6版本,它有32位和64位版本…那么,为什么您需要构建自己的框架呢?

        2
  •  4
  •   Thomas    12 年前

    还有另一个区别:通常由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
  •  1
  •   bsergean    15 年前

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

        4
  •  0
  •   tehfink    15 年前

    我用 Macports 在10.6上,安装多个版本的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/dpports/lang/python26/portfile(跟踪.macports.org/browser/trunk/dpports/lang/python26/portfile)

        5
  •  0
  •   Wheat    15 年前

    安装时,框架生成归“根”帐户所有。源生成将由安装它的帐户所有。拥有python安装的所有权的好处(和缺点)是您不需要更改帐户来修改它。

    一个小的区别是框架构建是基于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)。