如何让Python和distutils在Mac OS X上使用正确的SDK?

2 投票
2 回答
1936 浏览
提问于 2025-04-17 00:54

我在Mac OS X 10.6上使用Python。最近我安装了最新的Mac OS X开发工具包SDK,其中包含了GCC编译器。我现在拥有的SDK有:

$ ls /Developer/SDKs/
MacOSX10.4u.sdk MacOSX10.5.sdk  MacOSX10.6.sdk

我希望在使用Python/distutils时,能够在安装需要编译的Python包时,使用Mac OS X 10.6的环境,也就是当我运行“setup.py install”命令时。

我注意到,Python在运行时会传递一些参数,比如-isysroot,指向的是Mac OS X 10.5(而不是10.6),也就是说:

$ python-config --cflags --ldflags
-I/Library/Frameworks/EPD64.framework/Versions/7.0/include/python2.7 -I/Library/Frameworks/EPD64.framework/Versions/7.0/include/python2.7 -fno-strict-aliasing -fno-common -dynamic -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.5.sdk -DNDEBUG -g -O3 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.5.sdk -I/Library/Frameworks/EPD64.framework/Versions/7.0/include
-L/Library/Frameworks/EPD64.framework/Versions/7.0/lib/python2.7/config -ldl -framework CoreFoundation -lpython2.7 EPD64.framework/Versions/7.0/Python

我该如何纠正这个问题呢?我希望它能使用10.6的SDK。

目前,当我在一个需要C语言编译的包上运行“python setup.py install”时,生成的GCC调用看起来是这样的:

gcc -fno-strict-aliasing -fno-common -dynamic -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.5.sdk -DNDEBUG -g -O3 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.5.sdk -I/Library/Frameworks/EPD64.framework/Versions/7.0/include -DHAVE_RINTF=1 -DHAVE_FINITE=1 -DHAVE_EXPM1=1 -DHAVE_RINT=1 -DHAVE_LOG2=1 -DHAVE_LOGBL=1 -DHAVE_SNPRINTF=1 -DHAVE_LOG1P=1 -DHAVE_ROUND=1 -DHAVE_FMIN=1 -Iinclude -Isrc/lapack -Isrc/f2c -I/Library/Frameworks/EPD64.framework/Versions/7.0/include/python2.7 -c src/f2c/signal_.c -o build/temp.macosx-10.5-x86_64-2.7/src/f2c/signal_.o

这会调用路径中的10.5 SDK。

我使用的是Enthought Python Distribution版本的Python,不知道这是否会有影响。

非常感谢。

2 个回答

3

我完全不同意@Ned Deily的看法。

发帖的人显然在使用Enthought Python Distribution(EPD),如果要安装一个全新的Python,就得重新搭建整个环境。

我也遇到过类似的情况。在我的MacBook上,使用的是Mac OS X 10.6,项目(MeshPy)可以正常构建,但在iMac上,使用的是Mac OS X 10.7,就不行了(没有提供10.5的SDK,而EPD就是用这个SDK构建的)。你可以尝试安装这个旧的SDK,不过有一个更简单的解决办法(希望有效),就是创建一个符号链接:

    sudo ln -sf MacOSX10.6.sdk MacOSX10.5.sdk

这个方法对我有效。

6

这是一个功能,不用担心。Distutils这样做是为了确保你构建的C扩展模块和你正在使用的Python解释器是以相同的方式构建的。这样构建的扩展是向下兼容的:它们也可以在10.6上运行。如果你确实想使用10.6的ABI特性,你应该使用一个是用10.6 SDK构建的Python,比如说从最近的python.org 64位安装包,或者从MacPorts或Homebrew获取。

撰写回答