关于macos:python.org版本可以与Apple框架版本配合使用吗?

Can python.org releases play nice with Apple framework builds?

(对缺乏或正确链接的高级道歉;系统不允许我添加两个以上。)

不幸的是,我已经学会了很难在Mac OS X中使用默认的Python安装(特别是10.6.8)。

使用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 /),我的Python版本比Apple提供的版本更加成熟(非常适合开发),但是已经破坏了核心系统功能(这对其他一切都很糟糕。)到目前为止最明显的休息时间尝试运行namebench(https://code.google.com/p/namebench/),Blink(http://icanblink.com/)和Mercurial(https://www.mercurial-scm.org/ )。从我可以收集的信息来看,它是由路径决定的。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ /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(是否在OSX SL上预装了PyObjC?)而且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来引用与默认框架安装相同的路径?如果是这样,最好的方法是什么?如果没有,是否有可以回滚到系统默认值的方法?


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

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

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

/System/Library/Frameworks/Python.framework

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

1
/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使用构建第三方软件包中包含的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运行为一个Python构建的C扩展模块。

这意味着,通常,您需要为每个Python安装所需的第三方软件包的单独副本,如果它们尚未包含在该Python中。这包括基本项目,如easy_install(来自setuptoolsDistribute)。 10.5+中的Pythons系统包含/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安装程序会更改该顺序,但使用其绝对路径/usr/bin/python2.6仍然可以使用系统Python。或者您可以将更改还原为shell配置文件,例如.bash_profile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ 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