在OSX Mountain Lion上,Python安装太多了
我在以下位置有三个不同的Python 2.7:
/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
我使用了很多来自不同来源的包。目前我正在通过端口(MacPorts)、easy_install、pip(通过easy_install安装)和Mercurial来安装这些包。有些包我还需要从镜像安装或从源代码构建,这样我对它们的控制会更多一些。
问题是,easy_install和pip似乎都安装到了一个地方(/Library/Frameworks/...
),而MacPorts则安装到了另一个地方(/opt/local/Library/Frameworks/...
)。
我现在该怎么做呢?是删除/Library/Frameworks/.../python2.7
,然后把easy_install和pip移动到MacPorts的那个/opt/local/...
目录下?还是把这两个目录链接起来?或者把MacPorts的安装移动到/Library/Frameworks/...
?
我该如何整合这些Python?我试过把两个site-packages的位置都放到我的路径里,但只有某些包只能在一个Python中使用,而另一些则只能在另一个中使用,我需要它们都能同时使用。
4 个回答
我建议你在开发工作中只选择一个Python版本(我个人使用的是Python.org提供的版本)。
- 你无法去掉/Library/Frameworks这个文件夹,因为这是Mac系统自带的Python,删除它可能会导致一些问题。
- 剩下的两个Python版本,我猜一个是Macports,另一个是Python.org——你需要选择一个作为你的开发环境,并坚持使用它。
我强烈建议不要用一个Python的pip
或easy_install
去安装另一个Python的模块。原因是不同的Python版本在编译选项上可能会有差异。在Mac上让某些包正确编译已经够麻烦的了,如果你开始用不同的二进制文件进行编译(这些文件可能支持不同的架构),那只会让你更头疼。
我个人选择了以下的做法:
- 我在所有开发中都使用Python.org的包。
- 在终端登录时,我运行一些脚本来优先选择我的Python版本。
- 我的每个项目都有自己的虚拟环境,并且我禁用了系统包。
- 在开始任何项目时,我通常会有一个环境设置脚本。我只需输入
go_myproject.source
;这会让我切换到正确的目录,并运行source /path/to/virtualenv/bin/activate
来为该项目做好准备。
虽然设置过程有点麻烦,但自从这样做后,我感觉非常好。管理项目时,不用担心一个项目的依赖或升级会影响到另一个项目,这种感觉真是太棒了。
虽然这不是一个通用的解决办法,但我会使用虚拟环境(virtualenv)来安装Mercurial和其他基于Python的应用程序。具体来说,使用pip和easy_install时,它们只会安装到各自的虚拟环境里,而不会把东西乱放到系统文件夹里。这样做的缺点是,我可能会有一些包的重复安装;但好处是,我可以拥有一个干净、独立的环境,并且知道自己用的Python版本(这对像Mercurial这样的关键应用来说,对我来说更重要)。
另一个缺点是,我需要把每个应用程序链接到我个人的bin目录,或者把虚拟环境的bin目录添加到我的路径中。(我个人是通过一些简单的脚本来管理这个链接的工作。)
看起来你对自己正在构建的东西有控制权。下面是我如何把 macports 和 pip 合并在一起的:
我喜欢用 Macports 来管理我的所有东西,所以我确保 pip
和 easy_install
是在 macports 安装的 python 里运行的(也就是在 /opt/local/...
这个路径下的)。
你可以通过以下命令来查看 pip 和 easy_install 会把东西安装到哪里:
readlink `which pip`
(那些是反引号)
如果你想让 pip 安装到 macports 的目录里,可以用 macports 来安装 pip:
sudo port install py-pip
然后,确保 which pip
指向类似下面的路径:
askewchan@rock:~$ which pip
/opt/local/bin/pip
askewchan@rock:~$ readlink `which pip`
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/pip-2.7
根据下面的评论(感谢 @Jonathan 和 @Ned),你也可以用 easy_install
来做同样的事情,但它的端口叫做 py-distribute
:
sudo port install py-distribute
不过据我所知,你其实不需要用 easy_install
,因为 任何可以用 easy_install
安装的东西,用 pip
安装会更好。
注意端口的描述:
askewchan@rock:Tracking {master *}$ port search *easy*install*
py-pip @1.2.1 (python, www)
An easy_install replacement
askewchan@rock:Tracking {master *}$ port search py*distribute
py-distribute @0.6.35 (python, devel)
Replacement for setuptools