Boost python на mac os x lion с пользовательским python

Я пытаюсь получить boost python для работы с пользовательской библиотекой python. У меня есть источник python и build boost.python, используя:

./bootstrap.sh --with-python-root=../Python-2.7.2 --with-libraries=python

затем ./b2

но когда я пытаюсь использовать boost.python в своем приложении, я получаю

Fatal Python error: Interpreter not initialized (version mismatch?)

Когда я вызываю PyRun_SimpleString("import sys\nprint sys.version"); , Я получаю 2.7.2, как я ожидаю (и версию python я создаю boost.python, а не версию системы.)

Есть что-то, что мне не хватает?

Когда я проверяю, с какой библиотекой связан dylib, я получаю следующее:

 libboost_python.dylib (compatibility version 0.0.0, current version 0.0.0) /System/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.1) /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)` 

В моей целевой программе Xcode я включаю python из папки аргументов -with-python-root и содержимого boost / stage / lib,

Библиотеки ссылок

Я загрузил boost python и скомпилировал его против моего настраиваемого python, установленного с использованием Mac-портов, и, похоже, он работает нормально.

Мои шаги …

 $ /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/python Python 2.7.2 (default, Nov 17 2011, 00:52:26) $ sudo ./bootstrap.sh --with-libraries=python --with-python-root=/opt/local/Library/Frameworks/Python.framework/Versions/2.7 $ ./b2 $ cd /Users/YourName/Downloads/boost_1_48_0/libs/python/example/tutorial $ ../../../../bjam ...patience... ...patience... ...found 1577 targets... ...updating 12 targets... common.mkdir bin common.mkdir bin/darwin-4.2.1 common.mkdir bin/darwin-4.2.1/debug darwin.compile.c++ bin/darwin-4.2.1/debug/hello.o darwin.link.dll bin/darwin-4.2.1/debug/hello_ext.so common.copy libboost_python.dylib common.copy hello_ext.so common.mkdir bin/hello.test common.mkdir bin/hello.test/darwin-4.2.1 common.mkdir bin/hello.test/darwin-4.2.1/debug capture-output bin/hello.test/darwin-4.2.1/debug/hello **passed** bin/hello.test/darwin-4.2.1/debug/hello.test ...updated 12 targets... $ ls Jamroot hello.cpp hello_ext.so bin hello.py libboost_python.dylib $ python Python 2.7.2 (default, Nov 17 2011, 00:52:26) [GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import hello_ext >>> hello_ext.greet() 'hello, world' >>> 

Кроме того, если вам не нужно создавать все самостоятельно, вы можете использовать Mac-порты, чтобы помочь вам. Я не пробовал, но выглядел как boost.python был доступен, хотя версия 1.47 вместо 1.48.

 $ port info boost boost @1.47.0, Revision 2 (devel) Variants: debug, no_single, no_static, openmpi, python24, python25, python26, python27, python31, python32, regex_match_extra, universal Description: Boost provides free portable peer-reviewed C++ libraries. The emphasis is on portable libraries which work well with the C++ Standard Library. Homepage: http://www.boost.org Library Dependencies: zlib, expat, bzip2, icu Platforms: darwin License: Boost-1.0 Maintainers: adfernandes@macports.org 

На самом деле, чтобы решить эту проблему, мы можем взглянуть на нашу среду и сравнить, если у вас все еще есть проблемы :).

$ echo $ press-TAB

Похоже, вы связываете boost python с неправильной версией python (2.7.0), а ваше приложение против правильной версии python (2.7.2) – PyRun_SimpleString имеет ничего общего с повышением уровня python, но это прямой вызов в API Python из вашего тестового приложения.

Я использую файл project-config.jam (в каталоге boost build), чтобы настроить, для чего должен быть построен python boost-python, включая эту строку (для привязки к моей простой установке 2.7):

 using python : 2.7 : /Library/Frameworks/Python.framework/Versions/2.7/ ; 

Первая проверка

Это может быть несоответствие между связанным dylib и действительно используемым включением. Одна простая проверка – передать опцию --debug-configuration для bjam и проверить пути include и link:

 ./b2 -q --prefix=your_install_dir YOU_OTHER_OPTIONS --debug-configuration install 

должны давать эти строки в начале:

 notice: [python-cfg] Configuring python... notice: [python-cfg] user-specified version: "2.7" notice: [python-cfg] user-specified cmd-or-prefix: "/Library/Frameworks/Python.framework/Versions/2.7" notice: [python-cfg] Checking interpreter command "/Library/Frameworks/Python.framework/Versions/2.7/bin/python"... notice: [python-cfg] running command '/Library/Frameworks/Python.framework/Versions/2.7/bin/python -c "from sys import *; print('version=%d.%d\nplatform=%s\nprefix=%s\nexec_prefix=%s\nexecutable=%s' % (version_info[0],version_info[1],platform,prefix,exec_prefix,executable))" 2>&1' notice: [python-cfg] ...requested configuration matched! notice: [python-cfg] Details of this Python configuration: notice: [python-cfg] interpreter command: "/Library/Frameworks/Python.framework/Versions/2.7/bin/python" notice: [python-cfg] include path: "/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7" notice: [python-cfg] library path: "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config" "/Library/Frameworks/Python.framework/Versions/2.7/lib" notice: [python-cfg] framework directory is "/Library/Frameworks/Python.framework" 

вы должны увидеть, что интерпретатор, include и двоичные файлы соответствуют ( interpreter command , include path и library path соответственно).

Если есть несоответствие, проверьте файл python-config в usr/bin : он должен указать путь установки python.org. Если нет, установщик пропустил его, и он должен быть исправлен.

Вторая проверка

Возможно, что библиотека, связанная с ней, неправильно установлена ​​в /usr/lib . С помощью простого ls -al /usr/lib/*python* вы должны увидеть /usr/lib/libpython2.7.dylib который указывает на установку python.org. Если нет, установщик python.org пропустил его, и он должен быть исправлен.

Извините за то, что вы немного расплывчаты. У меня был этот вопрос 1 год назад и исправил его вручную, выполнив много до тех пор, пока он не работал …