virutalenv 是一个很棒的工具,对于在大多数平台上管理多个 Python 实例非常有用。但是,在 Mac OS X 上,事情会更加复杂,因为使用框架构建使得遇到即使是相同主要版本的 Python 的多个实例也很常见。我建议您先了解并熟悉如何在 Mac OS X 上管理框架安装,然后再深入研究virtualenv。
“/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/ - SRSLY?”
是的,这是 Python Mac OS X 框架构建中的默认位置。大多数 Mac OS X 上的 Python 分发者使用框架构建,每个通常使用不同的根目录,因为它可以更简单地支持多个版本并将为特定 Python 实例安装的所有站点包保存在一起在一个地方。
对于 Mac OS X 10.6,Apple 提供 Python 2.6(植根于 /System/Library/Frameworks/Python.framework 并符号链接到 /usr/bin/python2.6)以及 Python 2.5(为了与 Mac OS X 10.5 兼容 - 你看到的就是 /usr/bin/python2.5) . python.org Mac OS X 安装程序安装到/Library/Frameworks/Python.framework。 MacPorts 使用/opt/local/Library/Frameworks/Python.framework。
框架包含一个bin 目录(在框架中的../Versions/x.x/bin);这通常是安装包脚本的默认位置。它也是放置解释器二进制文件的符号链接的地方。
这是一个安装了多个 Python 版本的 python.org 风格的框架:
$ cd /Library/Frameworks/Python.framework/Versions/
$ ls -l
total 8
drwxrwxr-x 8 root admin 340 Dec 23 2008 2.5/
drwxrwxr-x 8 root admin 340 Aug 10 21:42 2.6/
drwxrwxr-x 8 root admin 340 Jul 3 12:24 2.7/
drwxrwxr-x 7 root admin 306 Mar 23 17:42 3.1/
drwxrwxr-x 7 root admin 306 Aug 10 22:14 3.2/
lrwxr-xr-x 1 root admin 3 Aug 10 21:47 Current@ -> 2.6
$ cd 2.6
$ ls -l
total 7776
lrwxr-xr-x 1 root admin 17 Aug 10 21:47 Headers@ -> include/python2.6
drwxrwxr-x 3 root admin 102 Aug 10 21:42 Mac/
-r-xrwxr-x 1 root admin 3973552 Aug 10 21:41 Python*
drwxrwxr-x 4 root admin 170 Aug 10 21:48 Resources/
drwxrwxr-x 2 root admin 578 Aug 12 15:19 bin/
drwxrwxr-x 3 root admin 102 Aug 10 21:42 include/
drwxrwxr-x 3 root admin 646 Aug 10 21:43 lib/
drwxrwxr-x 3 root admin 102 Aug 10 21:41 share/
$ ls -l bin
total 264
-rwxrwxr-x 1 root admin 150 Aug 10 21:41 2to3*
-rwxr-xr-x 1 nad admin 360 Aug 12 15:19 easy_install*
-rwxr-xr-x 1 nad admin 368 Aug 12 15:19 easy_install-2.6*
lrwxr-xr-x 1 root admin 7 Aug 10 21:47 idle@ -> idle2.6
-rwxrwxr-x 1 root admin 138 Aug 10 21:41 idle2.6*
lrwxr-xr-x 1 root admin 8 Aug 10 21:47 pydoc@ -> pydoc2.6
-rwxrwxr-x 1 root admin 123 Aug 10 21:41 pydoc2.6*
lrwxr-xr-x 1 root admin 9 Aug 10 21:47 python@ -> python2.6
lrwxr-xr-x 1 root admin 16 Aug 10 21:47 python-config@ -> python2.6-config
-rwxrwxr-x 1 root admin 29584 Aug 10 21:43 python2.6*
-rwxrwxr-x 1 root admin 1463 Aug 10 21:42 python2.6-config*
lrwxr-xr-x 1 root admin 10 Aug 10 21:47 pythonw@ -> pythonw2.6
-rwxrwxr-x 1 root admin 29584 Aug 10 21:43 pythonw2.6*
lrwxr-xr-x 1 root admin 11 Aug 10 21:47 smtpd.py@ -> smtpd2.6.py
-rwxrwxr-x 1 root admin 18272 Aug 10 21:41 smtpd2.6.py*
这是一个 MacPorts bin,包括一些额外的站点包:
$ cd /opt/local/Library/Frameworks/Python.framework/Versions/2.6
$ ls -l bin
total 952
-rwxr-xr-x 2 root wheel 160 Jul 15 01:56 2to3*
-rwxr-xr-x 2 root wheel 1541 Jun 8 19:59 apirst2html.py*
-rwxr-xr-x 2 root wheel 363 Oct 5 2009 bdist_mpkg*
[...]
-rwxr-xr-x 2 root wheel 211 Jun 2 12:45 django-admin.py*
-rwxr-xr-x 2 root wheel 410 Jul 15 17:30 easy_install*
-rwxr-xr-x 2 root wheel 418 Jul 15 17:30 easy_install-2.6*
[...]
-rwxr-xr-x 2 root wheel 368 Jun 24 02:00 pip*
-rwxr-xr-x 1 root wheel 342 Sep 18 2009 pkginfo*
[...]
lrwxr-xr-x 1 root wheel 9 Jul 15 01:58 python@ -> python2.6
lrwxr-xr-x 1 root wheel 16 Jul 15 01:58 python-config@ -> python2.6-config
-rwxr-xr-x 2 root wheel 24932 Jul 15 01:57 python2.6*
-rwxr-xr-x 2 root wheel 1473 Jul 15 01:57 python2.6-config*
[...]
如果您使用 python.org 安装程序或 MacPorts 安装 2.7 或 3.1 Python,它们都植根于 /Library/Frameworks 或 /opt/local/Library/Frameworks 并且很乐意与其他版本共存。要成功使用框架安装,您需要管理您的 shell PATH。特别是,您应该确保要使用的 Python 的框架 bin 目录位于您的 PATH 上。所以对于 MacPorts,~/.bash_profile:
export PATH="/opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin:/opt/local/bin:$PATH
或者对于 python.org 安装程序:
export PATH="/Library/Frameworks/Python.framework/Versions/2.6/bin:$PATH
此外,通常您需要为您使用的每个 Python 实例安装一个单独版本的您最喜欢的 Python 包管理插件(例如 pip 或来自 Distribute 或 setuptools 的 easy_install 命令)。每个都安装到默认脚本目录(即框架bin 目录)中。当你安装它的包版本(sudo port install py26-pip 或sudo port install py31-distribute)时,MacPorts 会自动处理这个问题。请注意,Apple 在 /usr/bin 中为其 Python 提供了一组 easy_install 链接,它们将软件包安装到 /Library/Python。您需要确保使用适合您的 Python 实例的 easy_install 或 pip。确保实例的框架 bin 目录位于 PATH 的首位,以确保这一点。
注意,如果您使用 MacPorts,可以使用它的 python_select 命令来管理 /opt/local/bin/python 指向的 Python 实例。然后,如果/opt/local/bin 出现在您的 PATH 列表中比具有python 的其他目录更早,它将决定哪个是您的默认python。但是您确实需要通过添加框架 bin 目录来管理 PATH,因此 python_select 通常不是那么有用。
使用 MacPorts(或类似的基础广泛的分销商)的另一个积极方面是它提供了许多流行的 Python 包包括处理构建和链接到第 3 方 C 库的偶尔混乱的细节,而不是随 Mac OS X 一起提供。例如,MySQLdb 和 PIL 包是 Mac OS X 上常见的绊脚石,因为 MySQL 客户端库和 libjpeg,但 MacPorts 使一切变得更容易。但是您可以选择直接使用 MacPorts (sudo port py26-pil) 或通过 pip (sudo pip install pil) 或 easy_install 安装东西,或者您可以下载源代码并自己安装 (sudo python setup.py ...)。而且由于所有这些方法都使用 Python 的 Distutils 来完成这项繁琐的工作,因此所有这些方法通常最终都会为给定的 Python 实例将包的文件安装在同一位置。