如何在OSX Lion下独立安装Python 2.7.x而不影响/System/Library/Frameworks?

2 投票
1 回答
1831 浏览
提问于 2025-04-17 16:58

有没有办法安装 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 个回答

3

是的,--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,我们需要看到完整的 configuremake 命令。但这就涉及到局部调试,不太适合在 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
            ...

否则,它应该没有任何影响。

撰写回答