可以python.org网站发布版与苹果框架构建配合得很好?

2024-10-01 07:28:18 发布

您现在位置:Python中文网/ 问答频道 /正文

(对于缺少或适当的链接深表歉意;系统不允许我添加两个以上的链接。)

不幸的是,我学到了一个很难的方法:你不应该在macosx(特别是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/)的安装程序,我有比苹果提供的更成熟的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包/*.egg
  • /Library/Python/2.6/site-packages
  • /系统/库/框架/Python.framework/Versions/2.6/lib/Python2.6
  • /系统/库/框架/Python.framework/Versions/2.6/Extras/lib/python

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

Python bug tracker中的问题#4865部分地解决了这个特定的问题,这个问题已经在2.7及更高版本中得到了修复。但由于它是“一个特性请求,而不是一个错误修复”,它还没有被后传到2.5和2.6。即使这样,看看提交的修复程序(http://hg.python.org/lookup/r70778),我也不确定它是否解决了对“Extras”目录的引用不足的问题。在

我知道我可以通过手动更改来手动向Python添加路径站点.py. 我还可以使用PYTHONPATH环境变量。我不想因为改变而造成更多的伤害站点.py和更改PYTHONPATH仅对使用我的用户帐户从shell运行的脚本/应用程序有效。在

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


Tags: org路径版本httpegglibpackages系统
1条回答
网友
1楼 · 发布于 2024-10-01 07:28:18

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

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

苹果对它随OSX发布的Python版本做了一些修改。从OS X 10.5以后,系统python安装在:

/System/Library/Frameworks/Python.framework

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

^{pr2}$

可以认为是由./Extras中的包扩展的。在

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

在macosx10.6中,苹果提供的Python是使用gcc-4.2构建的,只针对osx10.6,它包括3个CPU架构(i386x86_64,和ppc)。这个python.org网站Python2.6的安装程序也是为在旧系统上运行而构建的,因此目标是10.3及更高版本,使用gcc-4.0,并且只有32位(i386ppc)。因此,一般来说,不能同时运行为一个Python构建的C扩展模块。在

这意味着,通常情况下,您需要为每个Python安装所需的第三方软件包的单独副本,如果它们还没有包含在Python中。这包括基本项,如easy_install(来自setuptools或{})。10.5+中的系统python包含easy_install版本,它们的/usr/bin版本。如果安装python.org网站Python,您需要为它安装一个单独的版本;默认情况下,easy_install命令将安装在Python框架中的./bin目录中;这是Distutils的默认位置。这就是为什么建议您将此目录添加到shell路径(和python.org网站Python2的安装程序默认情况下会自动执行)。在

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

相关问题 更多 >