【问题标题】:Can python.org releases play nice with Apple framework builds?python.org 版本可以与 Apple 框架构建一起使用吗?
【发布时间】:2011-08-20 06:56:48
【问题描述】:

(对于缺少或正确的链接深表歉意;系统不允许我添加超过两个。)

不幸的是,我已经学会了不应该乱用 Mac OS X(特别是 10.6.8)中的默认 Python 安装的艰难方法。

在使用python.org 2.6.6 (http://www.python.org/getit/releases/2.6.6/) 和2.5.4 (http://www.python.org/getit/releases/2.5.4/) 安装程序后,我有了比Apple 提供的更成熟的Python 版本(非常适合开发),但是已经破坏了核心系统功能(这对其他一切都不利。)到目前为止,最明显的中断是在尝试运行 namebench (https://code.google.com/p/namebench/)、Blink (http://icanblink.com/) 和 Mercurial (https://www.mercurial-scm.org/) 时。从我能收集到的信息来看,这取决于路径。

在默认安装中,路径应类似于this question 中概述的内容。相反,我的看起来像这样:

$ /usr/bin/python2.6 -V
Python 2.6.6

$ which python
/usr/bin/python
$ python
Python 2.6.6 (r266:84374, Aug 31 2010, 11:00:51) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> for i in sys.path:
...     print i
... 
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pip-1.0.2-py2.6.egg
/Library/Frameworks/Python.framework/Versions/2.6/lib/python26.zip
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-darwin
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac/lib-scriptpackages
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-old
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages

(与 2.5 类似,但为简单起见,我将坚持使用 2.6。)

问题似乎是不包含:

  • /Library/Python/2.6/site-packages/*.egg
  • /Library/Python/2.6/site-packages
  • /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
  • /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python

这解释了为什么 Blink 和 namebench 找不到 PyObjC (Is PyObjC pre-installed on OSX SL?) 和 Mercurial 找不到它的模块(在 /Library/Python/2.6 中)

Python 错误跟踪器中的问题#4865 部分解决了这个特定问题,该问题已在 2.7 及更高版本中得到修复。但是因为它是“功能请求而不是错误修复”,所以还没有被向后移植到 2.5 和 2.6。即便如此,查看已提交的修复 (http://hg.python.org/lookup/r70778),我不确定它是否解决了缺少对“Extras”目录的引用。

我知道我可以通过手动更改 site.py 来手动添加 Python 的路径。我也可以使用 PYTHONPATH 环境变量。我宁愿不通过更改 site.py 造成任何进一步的损害,并且更改 PYTHONPATH 仅对使用我的用户帐户从 shell 运行的脚本/应用程序有效。

我能否让这些更新版本的 Python 引用与默认框架安装相同的路径?如果是这样,最好的方法是什么?如果没有,是否有可接受的回滚到系统默认值的方法?

【问题讨论】:

  • 咖啡桶:欢迎来到 SO!虽然额外的信息很好,但您帖子中的某些链接是不必要的。您不需要为所有内容提供每个下载/项目页面链接,如果需要进一步澄清,以后无论如何都可以在 cmets 中要求。
  • 谢谢夜莺。我可能对额外的信息有点不知所措。为以后的帖子适当地注明。

标签: python macos pyobjc


【解决方案1】:

您误解了 Python 安装在 OS X 上的工作方式。每个 Python 实例都有自己的 site-packages 目录。框架安装程序的标准位置在框架内./lib/pythonx.y/site-packages。因此对于安装到 /Library/Frameworks/Python.framework 的 python.org 安装程序,您将在此处找到它的 2.6 site-packages

/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/

Apple 对 OS X 发行版附带的 Python 版本进行了一些修改。从 OS X 10.5 开始,系统 Python 安装在:

/System/Library/Frameworks/Python.framework

Apple 选择在每个版本的非标准 ./Extras 目录中包含一些额外的第 3 方包。它还为每个版本的site-packages 目录使用非标准位置。它们是在/Library/Python/ 中创建的,大概是为了让用户安装的包不会修改/System/Library 中的任何内容。所以对于 Apple 提供的 Python 2.6,它的site-packages 目录是:

/Library/Python/2.6/site-packages

并且可以认为是被./Extras中的包扩展了。

每个 Python 实例都有一个单独的 site-packages 目录。即使是相同的 Python 次要版本(即 2.6),也不打算且通常不可能在不同实例的 site-packages 之间共享包。最明显的问题是 C 编译器版本、OS X ABI (MACOSX_DEPLOYMENT_TARGET)、SDK 版本和/或用于构建 Python 解释器的 CPU 架构通常存在差异,随后 Distutils 使用这些架构来构建 Python 解释器。构建包含在第 3 方包中的 C 扩展模块。

在 Mac OS X 10.6 中,Apple 提供的 Python 使用 gcc-4.2 构建,仅针对 OSX 10.6,包括 3 个 CPU 架构(i386x86_64ppc)。 Python 2.6 的 python.org 安装程序也可以在旧系统上运行,因此目标为 10.3 及更高版本,使用 gcc-4.0,并且仅 32 位(i386ppc)。所以,一般来说,你不能同时运行为一个 Python 构建的 C 扩展模块。

这意味着,通常情况下,您需要为每个 Python 安装所需的第 3 方软件包的单独副本,如果它们尚未包含在该 Python 中。这包括easy_install(来自setuptoolsDistribute)等基本项目。 10.5+ 中的系统 Python 在 /usr/bin 中包含 easy_install 版本。如果你安装了 python.org Python,你需要为它安装一个单独的版本;默认情况下,easy_install 命令将安装在 Python 框架中的 ./bin 目录中;这是 Distutils 的默认位置。这就是为什么建议您将此目录添加到您的 shell PATH 中(Python 2 的 python.org 安装程序默认会自动执行此操作)。

Issue4865 引入的更改并不是一个好的解决方案,并且可能会因 C 扩展模块而失败。在未来的版本中,我不会依赖它留在 Python 中。

另外安装 python.org Python 绝不会破坏系统 Python 中的任何内容,因为它们是使用不同文件系统位置的完全独立安装。唯一可能改变的是当您键入特定名称时调用的 Python 实例。 主要由你的 shell PATH 环境变量的搜索顺序控制。如前所述,默认情况下,python.org 安装程序会更改该顺序,但系统 Python 仍然可以通过使用其绝对路径 /usr/bin/python2.6 轻松获得。或者您可以恢复对 shell 配置文件的更改,例如,.bash_profile

$ echo $PATH
/Library/Frameworks/Python.framework/Versions/2.6/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
$ which python python2.6
/Library/Frameworks/Python.framework/Versions/2.6/bin/python
/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6
$ python -V
Python 2.6.6
$ python2.6 -V
Python 2.6.6
$ /usr/bin/python -V
Python 2.6.1
$ /usr/bin/python2.6 -V
Python 2.6.1
#
# remove python.org Python 2.6 from PATH
#
$ export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
$ which python python2.6
/usr/bin/python
/usr/bin/python2.6
$ python -V
Python 2.6.1
$ python2.6 -V
Python 2.6.1

【讨论】:

  • 感谢您的详细说明。为了节省重新创建 Apple 的 Python“环境”,我想删除 python.org 版本是最简单的。我刚刚看到您关于如何手动删除 python.org 安装的说明 (Issue7107),但我有一些保留意见。特别是,在我的系统上,/Library/Frameworks/Python.framework 是指向/System/Library/Frameworks/Python.framework/ 的符号链接。我错过了一些明显的东西吗?让我知道是否应该为此问题创建一个单独的问题。
  • /Library/Framework/Python.framework 不应是指向/System/Library/Frameworks/ 的符号链接。我不确定你可能安装了什么来做到这一点。移除它应该没有危险。但如果是这种情况,那么您就不再安装 python.org 版本,因为它显然已被此符号链接覆盖(并且我上面答案末尾的演示对您不起作用)。跨度>
  • 看我另外一台非开发10.6.8的机器,链接默认肯定是不存在的。我不确定它是怎么发生的。从符号链接的时间戳来看,它似乎是在我运行 2.5.4 安装程序的同时创建的。然后 2.6.6 安装程序已安装在 2.6.1 框架安装之上。不管怎样,这都是个坏消息。令人惊讶的是,在我执行 python.org 安装之前,Time Machine 有 2.5 和 2.6 的副本。如果您对我如何从中恢复有任何其他建议,我会很高兴听到这些建议。
  • 如果您有原始 /System/Library/Frameworks/Python.framework 的 Time Machine 备份(使用 Apple 2.6.1 和 2.5.4),我会删除错误的符号链接,然后 @ 987654358@ 将/System/Library/Frameworks/Python.framework 覆盖为/Library/Frameworks/Python.framework/,然后从Time Machine 备份中恢复/System/Library/Frameworks/Python.framework。我想你的状态应该很好。
  • P.S.我想我已经找到了该符号链接存在的一个可能原因:有人遵循 Python Wiki wiki.python.org/moin/MacPython/Leopard 中此页面的可疑建议。我暂时添加了警告。无论如何,那个页面已经过时了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
相关资源
最近更新 更多