如何在OSX Lion下独立安装Python 2.7.x而不影响/System/Library/Frameworks?
有没有办法安装 Python 2.7.x,让它完全不依赖于 /System/Library/Frameworks 下面的任何东西?也就是说,这样安装的 Python 即使在执行 sudo chmod 000 /System/Library/Frameworks
后也能正常工作。
我原以为只要在运行 ./configure
时不加 --enable-framework
这个选项就可以了,但我错了:这样安装的 Python 仍然依赖于 /System/Library/Frameworks 下面的很多框架,当然也包括 /System/Library/Frameworks/Python.framework。换句话说,安装时选择和不选择 --enable-framework
之间似乎没有什么区别。
1 个回答
是的,--enable-framework
在构建和安装 Python 时确实有影响。如果不使用 --enable-framework
,Python 默认会以传统的“unix风格”构建,安装到 /usr/local/
目录,但你可以通过 --prefix=
选项在 ./configure
时更改这个路径。而使用 --enable-framework
则会将 Python 默认安装到 /Library/Frameworks
,不过你也可以指定其他路径。但无论如何,任何 Python 的构建都需要依赖操作系统提供的其他库和框架,这是正常的。你为什么对此感到担忧呢?
更新一下:如果你想避免使用 Apple 自带的系统 Python,比如那些在 /usr/bin
下的,和它们的共享组件在 /System/Library/Frameworks/Python.frameworks
,你只需安装另一个 Python 2.7,并且不要使用 /usr/bin/python2.7
。但这并不意味着你可以或应该避免使用其他系统框架。
不过,有一个已知的问题是,OS X 10.6 到 10.8 中的 Apple 提供的框架有问题,这个框架是 Tk 8.5,它被 Python 的 Tkinter 应用程序(包括 IDLE)使用。幸运的是,解决这个问题相对简单。和 Python 一样,你可以在 /Library/Frameworks
中安装一个更新的第三方版本的 Tcl 8.5 和 Tk 8.5 框架,一些 Python 发行版,比如从 python.org 下载的二进制安装包,会使用这些框架。如果你能使用的话,我们推荐 ActiveTcl 发行版。更多信息请查看 http://www.python.org/download/mac/tcltk/。
另外,请注意,你需要为你安装的每一个 Python 实例单独安装 Distribute
(或 setuptools
)、pip
(如果你使用的话)和/或 virtualenv
。不要陷入使用 Apple 提供的 /usr/bin/
下的 easy_install
命令的陷阱,这些是为系统 Python 准备的。
进一步更新:为了避免所有在 /S/L/F/Python.framework
下的东西。我已经尝试过你描述的那种方法,但最终的安装仍然依赖于 /S/L/F/Python.framework
下的东西。
我只能重申,无论你构建的是“unix”版本、“共享”版本,还是“框架”版本,最终的 Python 应该完全独立于 /System/Library/Frameworks/Python.framework
中的任何东西。如果不是,那就说明在构建过程中或者执行 Python 的方式上出现了问题。要确定问题出在哪里,需要更多的细节,至少需要一些像这样的内容:
/path/to/your/python -c "import sys, pprint; print(sys.version); print(sys.executable); pprint.pprint(sys.path)"
如果你是自己构建的 Python,我们需要看到完整的 configure
和 make
命令。但这就涉及到局部调试,不太适合在 StackOverflow 上讨论。
最后更新:在框架构建中,--enable-framework=/path/to
选项会将这个“前缀”作为框架的安装“前缀”位置,以及两个辅助目录,如果你使用的路径以 Library/Frameworks
结尾。所以,如果你使用了:
./configure --enable-framework=/baz/quux/Library/Frameworks && make && make install
它应该会导致:
/baz
quux
Applications
Python 2.7
Build Applet.app
IDLE.app
...
Library
Frameworks
Python
Version
2.7
Headers/
Python
...
Resources/
bin
...
2to3
idle2.7
...
python
python2
python2.7
...
include/
lib/
share/
bin
2to3 -> ...bin/2to3
...
idle2.7 -> ...bin/idle2.7
...
python -> ...bin/python
...
顶层的 bin 目录有点多余,实际上只是让事情变得复杂。它包含指向框架 bin
目录中可执行文件的符号链接。默认的框架构建会将它安装到 /usr/local/bin
。使用它的一个问题是,Distutils 安装的脚本默认会安装到框架的 bin
目录,而在顶层目录中不会有它们的别名。这就是为什么建议你将框架的 bin
目录放在你的 shell PATH
的最前面,而忽略顶层的 bin
。
如果在之前的 configure
中添加了 --prefix=/foo/bar
,那么它会将这个前缀路径作为多余的顶层 bin 目录的根。在上面的例子中,那个顶层的 bin
目录将会安装到:
/foo
bar
bin
2to3 -> ...bin/2to3
...
idle2.7 -> ...bin/idle2.7
...
python -> ...bin/python
...
否则,它应该没有任何影响。