将Python 2.7.1与苹果自带Python并排安装
我刚刚从 Python.org 下载了 Python 2.7.1 的 DMG 文件。我看到有人建议使用 ActivePython,但我更喜欢从 Python.org 下载的版本。
- 如果我直接运行 DMG 文件里的
mpkg
安装程序,接受所有默认设置,它会和苹果自带的 Python 和谐共存吗? - 如果我在终端输入
python
,我会得到哪个版本? - 在终端中,我怎么指定运行苹果自带的 Python?那我自己安装的 Python 呢?
- 关于安装不同版本的 Python 时设置
PATH
的说法是怎么回事?我知道 Python 安装程序会自动设置这些,但我还是想了解一下内部原理。我知道在 Windows 中怎么做(环境变量)。在 Mac OS X 中,我怎么调整PATH
?
我也可以先自己试试,但我对 Mac 还不太熟悉。Python 的安装过程比较复杂,需要把文件写到不同的文件夹,还要配置像 PATH
这样的操作系统设置。如果我想恢复到干净的状态,TrashMe 或 AppCleaner 可能对卸载 Python 不太有效。因此,我想对我上面的问题有更清晰的了解。
3 个回答
不同的Python安装可以顺利运行,特别是如果你使用了virtualenv
这个工具。
你可以参考以下文章:
这些文章会教你如何在不同的地方安装不同版本的Python,每个版本都有自己的库,这样你就可以在不同的项目中独立使用它们。我强烈建议你看看这些内容,因为它们还简单地解释了如何更改PATH
变量,这样你的命令行就能找到不同的Python安装。
这里有一些关于不同Python安装位置的快速信息:
在终端输入which python
可以告诉你Python的安装位置。你也可以用python -V
来查看当前使用的版本。记住,python
和python2.x
可能是不同的东西。你可以给不同的Python安装起个合适的名字,这样在终端或脚本中调用它们时就更方便,可以使用alias
命令。例如:
alias /Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 sys-py27
苹果自带的系统Python安装在
/System/Library/Frameworks/Python.framework
和/usr/bin/python
。- 实际上,你不应该试图手动删除这些文件,因为系统Python可能被你电脑上的其他软件使用。
要检查当前的系统Python版本,你可以使用:
python -c 'import sys;print(sys.version)'
你下载并运行的打包安装程序通常会安装到
/Library/Frameworks/Python.framework/Versions/2.7/bin/
。- 你可以手动删除Python.framework文件夹。如果你在应用程序文件夹中看到Python,可能还有IDLE、AppBuilder和PythonLauncher等其他东西,如果需要的话可以直接删除它们。
MacPorts会将Python或类似的python26和python27安装到
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/
。你可以使用常规的
sudo port uninstall packageName
来卸载它们,如果想要删除依赖项,可以使用类似下面的命令:sudo port uninstall python27 --follow-dependents installed
你通过
port
安装的所有额外库,比如numpy、scipy、PIL、opencv等,都会放在:/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages
- 是的,这样做是没问题的。
- 你需要更改相应的符号链接。你可以随时使用
which python
来检查。 - 你可以为不同的版本创建额外的符号链接(比如
python_mac
和python_standard
)。 - 可以看看 这个链接。
如果你在使用python.org的安装程序时没有更改默认的包,输入python
命令应该会运行新安装的Python 2.7。 (你需要在运行安装程序后开启一个新的终端会话才能看到这个效果。)目前,python.org为OS X提供的安装程序会在你的应用程序目录下创建一个名为Python m.n
的文件夹,具体名称取决于Python的版本。如果你查看/Applications/Python 2.7
,你会看到一个叫Update Shell Profile.command
的文件。这个文件是一个脚本,你可以用编辑器或者快速查看工具打开它。它的作用是修改OS X上最常用的几种shell程序的启动文件(比如bash
、sh
、csh
),确保新Python的可执行命令所在的目录被添加到PATH环境变量的最前面,这样当你输入python命令时,系统会先找到新安装的Python命令,而不是Apple自带的Python命令。默认情况下,安装程序会自动为你运行Update Shell Profile.command
。这应该会产生类似这样的结果:
$ cat ~/.bash_profile
# .bash_profile
# ... other stuff
# Setting PATH for Python 2.7
# The orginal version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH
如果你查看那个目录,你应该会看到类似这样的内容:
$ ls -l /Library/Frameworks/Python.framework/Versions/2.7/bin
total 272
lrwxr-xr-x 1 root admin 8 Nov 30 00:49 2to3@ -> 2to3-2.7
-rwxrwxr-x 1 root admin 140 Nov 30 00:30 2to3-2.7*
lrwxr-xr-x 1 root admin 7 Nov 30 00:49 idle@ -> idle2.7
-rwxrwxr-x 1 root admin 138 Nov 30 00:30 idle2.7*
lrwxr-xr-x 1 root admin 8 Nov 30 00:49 pydoc@ -> pydoc2.7
-rwxrwxr-x 1 root admin 123 Nov 30 00:30 pydoc2.7*
lrwxr-xr-x 1 root admin 9 Nov 30 00:49 python@ -> python2.7
lrwxr-xr-x 1 root admin 16 Nov 30 00:49 python-config@ -> python2.7-config
-rwxrwxr-x 1 root admin 33764 Nov 30 00:31 python2.7*
-rwxrwxr-x 1 root admin 1663 Nov 30 00:31 python2.7-config*
lrwxr-xr-x 1 root admin 10 Nov 30 00:49 pythonw@ -> pythonw2.7
-rwxrwxr-x 1 root admin 33764 Nov 30 00:31 pythonw2.7*
lrwxr-xr-x 1 root admin 11 Nov 30 00:49 smtpd.py@ -> smtpd2.7.py
-rwxrwxr-x 1 root admin 18586 Nov 30 00:30 smtpd2.7.py*
新的Python可以通过命令python2.7
来使用,同时也有一个指向它的符号链接,叫python
。因为PATH环境变量已经被修改:
$ echo $PATH
/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
当你在shell中输入python
命令时,这个符号链接会被优先找到,而不是Apple自带的python
,后者位于/usr/bin
,这是系统提供的用户命令安装的目录之一(比如在OS X 10.6上):
$ ls /usr/bin/py*
/usr/bin/pydoc* /usr/bin/python-config* /usr/bin/python2.6-config@
/usr/bin/pydoc2.5@ /usr/bin/python2.5@ /usr/bin/pythonw*
/usr/bin/pydoc2.6@ /usr/bin/python2.5-config@ /usr/bin/pythonw2.5@
/usr/bin/python* /usr/bin/python2.6@ /usr/bin/pythonw2.6@
(注意,一般来说,你不应该尝试修改或删除/usr/bin
中的文件,因为它们是OS X的一部分,由Apple管理。)
在OS X上管理多个Python安装有很多方法;你可以查看相关的资料或上网搜索。需要记住的一点是,你总是可以使用绝对路径来调用你想要的Python命令进行检查。因此,按照上面的修改路径,你应该会看到以下行为:
$ /Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 -c 'import sys;print(sys.version)'
2.7.1 (r271:86882M, Nov 30 2010, 09:39:13)
[GCC 4.0.1 (Apple Inc. build 5494)]
$ python2.7 -c 'import sys;print(sys.version)'
2.7.1 (r271:86882M, Nov 30 2010, 09:39:13)
[GCC 4.0.1 (Apple Inc. build 5494)]
$ python -c 'import sys;print(sys.version)'
2.7.1 (r271:86882M, Nov 30 2010, 09:39:13)
[GCC 4.0.1 (Apple Inc. build 5494)]
$ /usr/bin/python -c 'import sys;print(sys.version)'
2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)]
$ /usr/bin/python2.6 -c 'import sys;print(sys.version)'
2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)]