Ошибка связывания Python Boost.Python

Я использую Mac OS X 10.8.4 (Darwin 12.4.0) с последним дистрибутивом Boost (1.55.0). Я следую приведенным здесь инструкциям, чтобы создать учебный проект Boost-Python, включенный в мой дистрибутив, и он прекрасно собирается.

Тем не менее, выходные скомпилированные библиотеки зависят от системы Python Mac, а не от Python anaconda, на который я пытаюсь ссылаться:

[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

Аналогично: Homebrew + Python на Mac OS X 10.8: фатальная ошибка Python: PyThreadState_Get: нет текущего потока, импортирующего mapnik

2 ответа

Попробовав много других решений, которые я нашел в Интернете, я потерял терпение и решил пойти со своим собственным (очень плохим) взломом. Я создал 2 bash-скрипта, один для связи Python sys с Anaconda, а другой для связи с исходным 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

Я решаю эту проблему с помощью install-name-tool изменить имя зависимого dylib:

  1. Чтобы изменить разрешение вашего libboost_python.dylib:

    chmod +w libboost_python.dylib

  2. Затем измените зависимую dylib:

    install_name_tool -change libpython2.7.dylib /path/to/anaconda/lib/libpython2.7.dylib "libboost_python.dylib"

Надеюсь, это полезно.

Другие вопросы по тегам