2

有没有办法构建和安装 Python 2.7.x,使其对 /System/Library/Frameworks 下的任何内容没有任何直接依赖?(IOW,这样的 Python 即使在之后也应该保持功能sudo chmod 000 /System/Library/Frameworks。)

--enable-framework我认为在运行时省略标志就足够了./configure,但我错了:如果我这样做,生成的 Python 仍然对 /System/Library/Frameworks 下的框架有很多依赖关系,当然包括 /System /图书馆/框架/Python.framework。(IOW,人们不得不怀疑安装和不选择安装之间是否有任何区别--enable-framework。)

4

1 回答 1

3

是的,--enable-framework在构建和安装 Python 时会有所不同。如果没有--enable-framework,Python 将默认安装为传统的“unix 样式”构建,/usr/local/但可以通过--prefix=选项更改为./configure. --enable-framework构建一个默认安装到 的 Python /Library/Frameworks,尽管可以通过指定另一个路径来更改--enable-framework. 但是任何 Python 构建都将依赖于操作系统提供的其他库和框架。这个是正常的。你为什么担心它?

更新:只需安装另一个 Python 2.7 而不是使用 / usr/bin/python2.7。但这并不意味着您应该或可以避免使用其他系统框架。

也就是说,在 OS X 10.6 到 10.8 中,有一个已知的有问题的 Apple 提供的框架供 Python 使用:即 Tk 8.5,由包括 IDLE 在内的 Python Tkinter 应用程序使用。幸运的是,解决这个问题很容易。与 Python 一样,您可以将 Tcl 8.5 和 Tk 8.5 框架的更新的第三方版本安装到/Library/Frameworks某些 Python 发行版中,例如来自 python.org 的二进制安装程序,将使用它们。如果您能够使用它,我们推荐使用 ActiveTcl 发行版。有关详细信息,请参阅http://www.python.org/download/mac/tcltk/

另外,请注意,您需要为您拥有的每个Python 实例安装Distribute(或setuptools)、pip(如果您使用它)和/或virtualenv的单独版本。不要陷入使用 Apple 提供的用于系统 Python 的命令的陷阱。easy_install/usr/bin/

进一步更新:随着进一步细化

避免 /S/L/F/Python.framework 下的所有东西”。我已经尝试过类似你描述的东西,但生成的安装仍然取决于 /S/L/F/Python.framework 下的东西

我所能做的就是重申构建自己的 Python,无论是“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坚持configure使用以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目录中,并且在顶级目录中不会有它们的别名。这就是为什么建议您将 frameworkbin目录放在 shell 的头部PATH而忽略顶层的bin.

如果--prefix=/foo/bar添加到前一个configure,它将使用前缀路径作为残留顶级 bin 目录的根目录。在上面的示例中,该顶级bin目录将安装在:

/foo
    bar
        bin
            2to3 -> ...bin/2to3
            ...
            idle2.7 -> ...bin/idle2.7
            ...
            python -> ...bin/python
            ...

否则,它应该没有效果。

于 2013-02-24T22:38:07.703 回答