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

时间:2011-08-20 06:56:48

标签: python macos pyobjc

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

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

使用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.org安装程序后,我的Python版本比Apple提供的版本更加成熟(非常棒)对于开发来说,但是已经破坏了核心系统功能(这对其他所有东西都是坏的。)到目前为止最明显的休息时间是尝试运行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 / *。蛋
  • /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来引用与默认框架安装相同的路径?如果是这样,最好的方法是什么?如果没有,是否有可以回滚到系统默认值的方法?

1 个答案:

答案 0 :(得分:3)

您误解了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开始,系统Pythons安装在:

/System/Library/Frameworks/Python.framework

并且Apple选择在每个版本的非标准./Extras目录中包含一些额外的第三方软件包。它还为每个版本的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用于构建第三方软件包中包含的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安装所需的第三方软件包的单独副本(如果它们尚未包含在该Python中)。其中包括easy_install(来自setuptoolsDistribute)等基本项目。 10.5+中的Pythons系统在easy_install中包含/usr/bin版本。如果你安装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