Использование Boost.Python для создания общей библиотеки и импорта ее в Blender через Python

То, что я сейчас пытаюсь достичь, — это построение отображения Python моих классов C ++ с помощью Boost.Python.
После этого я хочу использовать результирующую разделяемую библиотеку в дополнении к Blender, чтобы иметь возможность воспользоваться уже существующей функциональностью, предоставляемой отображенными классами C ++.

Я уже могу собрать свою общую библиотеку и написать примеры скриптов на python, которые также используют мою библиотеку.

Здесь все хорошо, но проблема в том, что, как только я пытаюсь использовать его в дополнении, Blender 2.74 все время падает, как только я добавляю оператор импорта с этим небольшим указанием в отчете о сбое:

6   libboost_python.dylib           0x000000010aa7cc3e boost::python::detail::init_module(PyModuleDef&, void (*)()) + 30 (module.cpp:44)

Внутри module.cpp внутри линии форсирования 41-46:

BOOST_PYTHON_DECL PyObject* init_module(PyModuleDef& moduledef,       void(*init_function)())
{
return init_module_in_scope(
PyModule_Create(&moduledef),
init_function);
}

Мой boost 1_58 скомпилирован с использованием Python 3.4.2:

otool -L /usr/local/lib/libboost_python.dylib
/usr/local/lib/libboost_python.dylib:
libboost_python.dylib (compatibility version 0.0.0, current version 0.0.0)
/Library/Frameworks/Python.framework/Versions/3.4/Python (compatibility version 3.4.0, current version 3.4.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

Запуск python3 bin из этого каталога дает мне:

python3
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct  5 2014, 20:42:22)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

Консоль Blender Python дает мне:

PYTHON INTERACTIVE CONSOLE 3.4.2 (default, Nov 25 2014, 12:01:44)  [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.54)]

Command History:     Up/Down Arrow
Cursor:              Left/Right Home/End
Remove:              Backspace/Delete
Execute:             Enter
Autocomplete:        Ctrl-Space
Zoom:                Ctrl +/-, Ctrl-Wheel
Builtin Modules:     bpy, bpy.data, bpy.ops, bpy.props, bpy.types, bpy.context, bpy.utils, bgl, blf, mathutils
Convenience Imports: from mathutils import *; from math import *
Convenience Variables: C = bpy.context, D = bpy.data
>>>

Мой собственный проект также использует эту версию Python.
Также Blender использует эту версию Python.

Я действительно не знаю, что попробовать здесь, так как в автономном режиме ВСЕ работает, как ожидалось.
Также тот факт, что сбой происходит даже после запуска нового скрипта в текстовом редакторе Blenders с оператором import.

У кого-нибудь есть опыт работы с Boost.Python и Blender?

заранее спасибо

ОБНОВИТЬ:
После сборки и запуска blender в режиме отладки я получил следующее состояние:
введите описание изображения здесь

Это не выглядит правильно и описывает падение в первую очередь.
Все еще ищу причину …

1

Решение

Сам Blender (а также библиотеки oiio и osl) созданы с использованием boost, убедитесь, что версия, которую вы используете для сборки boost-python, совпадает с версией, используемой blender. Так как blender уже загрузил библиотеки расширения в ram, при импорте boost-python он будет использовать уже загруженные библиотеки расширения, а не те, с которыми вы построили boost-python, если каждая из них имеет свою версию, это может вызвать проблемы, если каждая из них построена с использованием различные варианты это также может вызвать проблемы.

Если вы собираете blender самостоятельно, также соберите OpenImageIO и OpenShadingLanguage, чтобы они использовали ту же версию Boost. Создавая их самостоятельно, вы можете убедиться, что все они загружают версию, которую вы хотите использовать. Проверьте, что ваши настройки cmake или sconscript указывают на те же файлы lib lib.

% ldd блендер | grep boost

libboost_filesystem.so.1.55.0 => /usr/local/lib/libboost_filesystem.so.1.55.0 (0x806009000)

libboost_regex.so.1.55.0 => /usr/local/lib/libboost_regex.so.1.55.0 (0x80621e000)

libboost_system.so.1.55.0 => /usr/local/lib/libboost_system.so.1.55.0 (0x806525000)

libboost_thread.so.1.55.0 => /usr/local/lib/libboost_thread.so.1.55.0 (0x806728000)

libboost_date_time.so.1.55.0 => /usr/local/lib/libboost_date_time.so.1.55.0 (0x806942000)

libboost_wave.so.1.55.0 => /usr/local/lib/libboost_wave.so.1.55.0 (0x806b4f000)

libboost_locale.so.1.55.0 => /usr/local/lib/libboost_locale.so.1.55.0 (0x806e94000)

libboost_chrono.so.1.55.0 => /usr/local/lib/libboost_chrono.so.1.55.0 (0x814ee3000)

0

Другие решения

После долгих проб и ошибок я получил это работает!
Я постараюсь дать пошаговое руководство о том, как сделать это для OSX.
В следующие пару недель я также попытаюсь заставить его работать на Windows и обновлю этот ответ, как мне это удастся!

Шаг 1
Установите Python 3.4.2 из https://www.python.org/downloads/release/python-342/

Шаг 2
Оформить заказ в blender, git repo и svn repo из blender (можно найти на http://wiki.blender.org/index.php/Dev:Doc/Building_Blender/Mac):

mkdir ~/blender-build
cd ~/blender-build
git clone http://git.blender.org/blender.git
cd blender
git submodule update --init --recursive
git submodule foreach git checkout master
git submodule foreach git pull --rebase origin master

Скачать внешние библиотеки:

cd ~/blender-build
mkdir lib
cd lib
svn checkout https://svn.blender.org/svnroot/bf-blender/trunk/lib/darwin-9.x.universal

Шаг 3 Используйте CMake для создания проекта XCode для сборки блендера.
Убедитесь, что вы проверили следующие настройки для python:
Настройки CMake для python
Это автоматически настроит сборку Blender с использованием установленной на вашем Mac платформы Python.

Шаг 4 Загрузите и создайте надстройку с помощью Python 3.4.2
Здесь вы сначала должны проверить, какую версию использует Blender.
Во внешних библиотеках расширение хранилища SVN содержится в виде библиотеки предварительной сборки по адресу:

blender-build/lib/darwin-9.x.universal/README

Для меня это повышение 1,51: http://www.boost.org/users/history/version_1_51_0.html

Шаг 5 Создайте свою общую библиотеку с Boost 1.51 и Python 3.14

Шаг 6 Соберите блендер и убедитесь, что он использует установленный Python 3.4.2

Шаг 7 Скопируйте свою общую библиотеку в папку дополнений в blender.app
Вот маленький маленький совет: чтобы python мог распознать вашу разделяемую библиотеку, он должен иметь расширение .so, а не .dylib (для windows это .pyd, а не .dll)!

Шаг 8 Перепроверьте
Проверьте, что ваш надстройка скомпилирована с Python 3.4.2:

otool -L /usr/local/lib/libboost_python.dylib
/usr/local/lib/libboost_python3.dylib:
libboost_python3.dylib (compatibility version 0.0.0, current version 0.0.0)
/Library/Frameworks/Python.framework/Versions/3.4/Python (compatibility version 3.4.0, current version 3.4.0) <- IMPORTANT
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

Вы также можете проверить, может ли ваша библиотека использоваться в простом скрипте на python, таком как test.py, выполнив следующий скрипт в папке, где находится ваш .so:

import mylib
print('hello world!')

Бежать:

python3 test.py

По сути, теперь вы также должны иметь возможность выполнить этот простой скрипт внутри blender, что мне и нужно.

0

По вопросам рекламы [email protected]