更新:
我以前的答案在 Mesos 0.17.0 中大部分已经过时,因为这个版本确实完全处理了 clang 编译(耶!)。所以不再需要使用 gcc 来编译它——只需继续使用 Xcode 的 clang(Xcode 命令行实用程序)。
如果您仍然无法让 Python 绑定正常工作,请在 StackOverflow 上添加评论或新问题,或发布到 Mesos 邮件列表。
Mesos 0.16.0 或更低版本:
如何在 OS X (10.9) 上修复 Mesos 的 Python 绑定。
通过自制软件安装 Python 2.7.3
找出可用的版本
brew versions python
2.7.6 git checkout 3c86d2b /usr/local/Library/Formula/python.rb
2.7.5 git checkout a04b443 /usr/local/Library/Formula/python.rb
2.7.3 git checkout 865f763 /usr/local/Library/Formula/python.rb
2.7.4 git checkout 280581d /usr/local/Library/Formula/python.rb
[...]
选择 Python 2.7.3
cd /usr/local/Library/Formula/
git checkout 865f763 /usr/local/Library/Formula/python.rb
brew install python
确保不要强制安装通用版本(32 + 64 位),因为这会再次导致下面解释的相同问题。默认只有 64 位,这很好。
结合您的自定义 Python 安装重建 Mesos
rm -rf build
rm -rf ~/.python-eggs
mkdir build
cd build
../configure CXX=g++-4.7 CC=gcc-4.7 PYTHON=/usr/local/bin/python
make
make check
您现在应该看到一个正常运行的测试,因此是一个完美的 Mesos Python 绑定:
[运行]示例Test.PythonFramework
[ 好的 ] 示例Test.PythonFramework (1682 ms)
由于要求用户安装自定义 Python 版本通常是错误的,但在这种情况下似乎是不可避免的,让我草拟一下这个问题的解释。也许其中一位读者知道更好的解决方法。
使用详细输出设置手动执行该测试确实有助于确定确切的问题。
bin/mesos-tests.sh --gtest_filter="*.PythonFramework" --verbose
Traceback(最近一次调用最后一次):文件“/Users/till/Documents/Development/github/mesos-master/build/../src/examples/python/test_framework.py”,第 23 行,在 import mesos 文件“build /bdist.macosx-10.9-intel/egg/mesos.py”,第 26 行,文件“build/bdist.macosx-10.9-intel/egg/_mesos.py”,第 7 行,
文件“build/bdist.macosx” -10.9-intel/egg/_mesos.py",第 6 行,在
引导程序ImportError: dlopen(/Users/till/.python-eggs/mesos-0.16.0-py2.7-macosx-10.9-intel.egg-tmp /_mesos.so,2):未找到符号:__ZNSoD0Ev 引用自:/Users/till/.python-eggs/mesos-0.16.0-py2.7-macosx-10.9-intel.egg-tmp/_mesos.so 预期在:/Users/till/.python-eggs/mesos-0.16.0-py2.7-macosx-10.9-intel.egg-tmp/_mesos.so 中的平面命名空间
重要的细节是原生 Python 鸡蛋的动态链接失败了。
在构建 mesos 0.16 时,可以在distutils
此模块的构建步骤中找到原因。Pythondistutils
直接从python-config
. 由于您的 Python 是使用 构建的clang
,因此distutils
也会尝试使用 构建您的本机 egg clang
。
问题:
- Mesos 的 autoconf 阶段没有将编译器设置传播到
distutils
构建阶段。因此,尽管在上面的描述中 Mesos 本身是使用 gcc-4.7 构建的,但 egg 是使用 clang 构建的。结果是不兼容 ABI 的 libc++ 和 stdlibc++ 的混杂。
- 默认的 OS X Python
distutils
确实使用只有 clang 的 gcc-frontend 支持的参数强制构建通用二进制文件 (i386 + x86_64)。似乎没有解决方法,因此也必须为这两种架构构建该 egg 的所有动态链接依赖项(这似乎是 OS X 10.6 的遗留物)。
- Mesos 本身是静态链接到那个 egg 的,因此它不必被构建为一个通用二进制文件,egg 就可以在 64 位平台上构建和运行。但是,它将无法在 32 位平台上执行。
- 只要 Mesos 不支持 clang 编译(因此与 libc++ 相关联),唯一合适的解决方法似乎是安装不同编译的 Python。一个快速简单的解决方案是使用
homebrew
安装 Python 2.7.3。注意:不要安装 Python 2.7.6(homebrew 的当前默认值),因为它的 autoconf 开发者宏存在问题(参见MESOS-617)