OS X - 多个Python版本、PATH与/usr/local

5 投票
2 回答
4895 浏览
提问于 2025-04-15 14:06

如果你安装了多个版本的Python(我现在有默认的2.5,安装了3.0.1,现在又安装了2.6.2),系统会自动把一些东西放到/usr/local目录下,并且还会调整路径,让/Library/Frameworks/Python/Versions/theVersion/bin也包含在内。但是,既然/usr/local已经在路径里了,所有安装的版本(除了默认的2.5,它在/usr/bin里)都在这里,那这样做有什么意义呢?我把Python框架的路径从我的.bash_profile中删除了,结果我仍然可以输入"python -V" => "Python 2.5.1""python2.6 -V" => "Python 2.6.2""python3 -V" => "Python 3.0.1"。我只是想知道为什么它要把东西放到/usr/local,还要改变路径。我这样做可以吗?谢谢。

另外,2.6的安装让它成为了“当前”版本,.../Python.framework/Versions/Current指向2.6。所以在/usr/local/bin里的普通'python'指向2.6,但这没关系,因为/usr/bin在前面,里面同名的东西指向2.5。总之,2.5是随Leopard系统自带的,我安装3.0.1只是为了有最新版本(有dmg文件),现在我又安装了2.6.2来使用pygame。

编辑:好的,我理解是这样的。当你安装,比如说,Python 2.6.2时:会在/usr/local/bin添加一堆符号链接,这样当Python脚本里有#! /usr/local/bin/python这样的开头时,它就会运行。而在/Applications/Python 2.6里,Python启动器被设为默认应用来运行.py文件,它使用的是/usr/local/bin/pythonw,同时/Library/Frameworks/Python.framework/Versions/2.6/bin被创建并添加到路径的最前面,所以当你输入which python时,会找到那里的Python,#! /usr/bin/env python这样的开头也能正确运行。

2 个回答

0

我刚在我的Mac上发现了一个问题。我机器上装了Python 2.5.4、2.6.2和3.1.1,想找个简单的方法随意切换这些版本。于是我注意到在'/usr/bin'和'/usr/local/bin'里有很多指向这些可执行文件的符号链接(symlink)。我把所有不带版本号的符号链接都删掉了,留下了像python2.5、python2.6这样的链接,然后写了一个bash脚本,可以用管理员权限运行,来更改一个我常用的符号链接,这样就能指向我想用的Python版本。

这个符号链接指向的是:

'/Library/Frameworks/Python.framework/Versions/Current'

不过,删掉这些符号链接的唯一坏处就是,如果其他应用程序需要用到它们就麻烦了。我觉得这些符号链接的存在是因为安装程序想要兼顾所有情况。我的所有Python版本都是通过安装程序安装的,虽然我也在尝试自己编译一个,以便完全支持64位。在自己编译和安装的时候,可以选择不创建符号链接或者不修改安装时的路径(PATH)。

5

没有人能保证 /usr/local/bin 会一直在你的路径中(尤其是它不一定会在 /usr/bin 的前面!),所以安装程序确保特定需要的 /Library/.../bin 目录能够加入路径是很合理的。此外,/Library/.../bin 可能有一些额外的内容没有被链接到 /usr/local/bin,虽然我相信在最近的 Mac 标准 Python 版本中并不是这样。

如果你知道自己会如何安排路径,以及你使用的可执行文件完全来自 /usr/local/bin,那么当然可以把 /Library/etc 目录从你的路径中去掉。

撰写回答