OSX上的Mesos ExamplesTest.PythonFramework检查失败

时间:2013-12-22 20:03:34

标签: python macos gcc osx-mavericks mesos

成功编译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兼容   darwin上的Apple LLVM 5.0(clang-500.0.68)]

     

gcc-4.7(GCC)4.7.3版权所有(C)2012 Free Software Foundation,Inc。   这是免费软件;查看复制条件的来源。那里   不保修;甚至不适用于A的适销性或适用性   特别目的。


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

1 个答案:

答案 0 :(得分:3)

<强>更新

由于此版本完全处理了clang compilage(Yay!),我之前的回答大部分已经过时,因为Mesos 0.17.0已经过时了。所以不再需要使用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绑定:

  

[RUN] ExamplesTest.PythonFramework

     

[确定] ExamplesTest.PythonFramework(1682 ms)


由于要求用户安装自定义Python版本通常是错误的,但在这种情况下似乎是不可避免的,让我起草一个问题的解释。也许其中一位读者知道更好的解决方法。

使用verbosive输出设置手动执行该测试有助于确定确切的问题。

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行,in    bootstrap 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构建步骤中找到推理。 Python distutils直接从python-config派生出他们的构建设置。由于您的Python是使用clang构建的,distutils也会尝试使用clang构建您的原生蛋。

的问题:

  • Mesos的autoconf阶段没有将编译器设置传播到distutils构建阶段。因此,尽管Mesos本身是在上面的描述中使用gcc-4.7构建的,但是鸡蛋正在使用clang构建。结果是libc ++和stdlibc ++的混杂,它们不兼容ABI。
    • 该部分现在正在修复,Mesos也将在distutils构建阶段使用相同的编译器(请参阅MESOS-798MESOS-799)。很有可能当你读到这个答案时,那个特定的问题已经得到了解决。
  • 默认的OS X Python distutils使用只有clang的gcc-frontend支持的参数来强制构建通用二进制文件(i386 + x86_64)。似乎没有解决方法,因此必须为这两种架构构建该鸡蛋的所有动态链接依赖项(这似乎是OS X 10.6的剩余部分)。
  • Mesos本身静态地链接到那个蛋中,因此它不必构建为蛋的通用二进制文件,以便在64位平台上构建和运行。但是它无法在32位平台上执行。
  • 只要Mesos不支持clang compilage(因此与libc ++链接),唯一合适的解决方法似乎是安装不同编译的Python。一个快速简便的解决方案是使用homebrew安装Python 2.7.3。 注意:不要安装Python 2.7.6(当前的homebrew默认设置),因为它与autoconf开发人员宏有关的问题(参见MESOS-617