Boost.Python Python 连接错误
我正在使用 Mac OS X 10.8.4(Darwin 12.4.0)和最新的 Boost 版本(1.55.0)。我按照这里的说明来构建我分发包中包含的 Boost-Python 教程项目,构建过程很顺利。
不过,编译出来的库文件依赖于 Mac 自带的 Python,而不是我想要链接的anaconda Python:
[00:20] [tutorial] $ otool -L libboost_python.dylib
libboost_python.dylib:
libboost_python.dylib (compatibility version 0.0.0, current version 0.0.0)
libpython2.7.dylib (compatibility version 2.7.0, current version 2.7.0)
/opt/local/lib/libgcc/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.18.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
/opt/local/lib/libgcc/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
[00:20] [tutorial] $ otool -L /usr/lib/libpython2.7.dylib
/usr/lib/libpython2.7.dylib:
/System/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.2)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
我尝试了以下几种配置,但似乎都没有改变使用的 Python 版本:
$BOOST_ROOT/bootstrap.sh --with-python=$ANACONDA_PATH/bin/python
或者
# Here, I've explicitly chosen Anaconda-provided libpython2.7.dylib
# $BOOST_ROOT/stage/lib/libboost_python.dylib refers to the dynamic
# version of boost_python.
sudo g++ -I$BOOST_ROOT -I$ANACONDA_PATH/include -L$ANACONDA_PATH/lib
-lpython2.7 $BOOST_ROOT/stage/lib/libboost_python.dylib
hello.cpp -o hello_ext.so
或者
$BOOST_ROOT/bjam python=$ANACONDA_PATH/bin/python
无论如何,我总是会收到这个消息:
[01:58] [tutorial] $ python hello.py
Fatal Python error: PyThreadState_Get: no current thread
Abort trap: 6
这是系统 Python 调用的对比:
[01:58] [tutorial] $ /usr/bin/python hello.py
hello, world
类似的问题:在 Mac OS X 10.8 上使用 Homebrew 和 Python:致命的 Python 错误:PyThreadState_Get:没有当前线程导入 mapnik
2 个回答
我通过使用 install-name-tool
来更改依赖的 dylib
的名字,解决了这个问题:
首先,修改你的
libboost_python.dylib
的权限:chmod +w libboost_python.dylib
接着,修改依赖的
dylib
:install_name_tool -change libpython2.7.dylib /path/to/anaconda/lib/libpython2.7.dylib "libboost_python.dylib"
希望这对你有帮助。
在网上尝试了很多其他解决方案后,我失去了耐心,决定用自己的(非常糟糕的)方法来解决问题。我创建了两个bash脚本,一个是把系统的Python链接到Anaconda的Python,另一个是把链接重新指回原来的Python:
ana_py.sh
:
#!/usr/bin/env bash
# Link to Anaconda's Python
# $ANACONDA_PATH is the path to your anaconda folder
# BIN
cd /usr/bin
if [ ! -h python ]; then
sudo mv python python_orig;
else
sudo unlink python;
fi
sudo ln -s $ANACONDA_PATH/bin/python python
if [ ! -h python-config ]; then
sudo mv python-config python-config_orig;
else
sudo unlink python-config;
fi
sudo ln -s $ANACONDA_PATH/bin/python-config python-config
# INCLUDE
cd /usr/include
sudo unlink python2.7
sudo ln -s $ANACONDA_PATH/include/python2.7 python2.7
# LIB
cd /usr/lib
sudo unlink python2.7
sudo unlink libpython2.7.dylib
sudo ln -s $ANACONDA_PATH/lib/python2.7 python2.7
sudo ln -s $ANACONDA_PATH/lib/libpython2.7.dylib libpython2.7.dylib
sys_py.sh
:
#!/usr/bin/env bash
# Link to Mac OSX Python
# BIN
cd /usr/bin
sudo unlink python
if [ -f python_orig ]; then
sudo mv python_orig python;
else
sudo ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python python;
fi
sudo unlink python-config
if [ -f python-config_orig ]; then
sudo mv python-config_orig python-config;
else
sudo ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python-config python-config;
fi
# INCLUDE
cd /usr/include
sudo unlink python2.7
sudo ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 python2.7
# LIB
cd /usr/lib
sudo unlink python2.7
sudo unlink libpython2.7.dylib
sudo ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7 python2.7
sudo ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/Python libpython2.7.dylib
一旦你运行了 ana_py.sh
,你就可以运行 bootstrap.sh
、b2
和 bjam
,而不需要提供或修改它们的Python参数或选项。