3

成功编译 Mesos 0.16.0 后,在检查 PythonFramework 时运行测试失败。所有其他测试均成功通过。


我用于构建的步骤:

./bootstrap
mkdir build
cd build
../configure CXX=g++4.7 CC=gcc-4.7
make

然后,在运行测试时;

make check

结果如下所示:

[...]
[ RUN      ] ExamplesTest.PythonFramework
../../src/tests/script.cpp:78: Failure
Failed
python_framework_test.sh exited with status 1
[  FAILED  ] ExamplesTest.PythonFramework (201 ms)
[...]

环境:

OS X 10.9.1(小牛)

达尔文上的 Python 2.7.5(默认,2013 年 8 月 25 日,00:04:04)[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)]

gcc-4.7 (GCC) 4.7.3 版权所有 (C) 2012 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有保修;甚至不考虑适销性或特定用途的适用性。


如何构建适当的 Mesos Python 绑定以通过此环境中的测试?

4

1 回答 1

3

更新:

我以前的答案在 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++ 的混杂。
    • 该部分现在正在修复,Mesos 也将在distutils构建阶段使用相同的编译器(参见MESOS-798MESOS-799)。当您阅读此答案时,很有可能已经解决了该特定问题。
  • 默认的 OS X Pythondistutils确实使用只有 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

于 2013-12-22T20:03:33.803 回答