使用 Boost.Python 构建共享库并通过 Python 将其导入 Blender
Using Boost.Python to build a shared lib and import it in Blender through Python
我目前试图实现的是构建一个 python 映射到我的 C++ 类 到 Boost.Python。
在此之后,我想在搅拌机附加组件中使用生成的共享库,以便能够利用来自映射 C++ 类.
的现有功能
我已经可以构建我的共享库并在 python 中编写示例脚本,它们也在使用我的库。
一切都很好,但问题是,一旦我尝试在附加组件中使用它,一旦我在崩溃报告中添加带有这个小提示的导入语句,Blender 2.74 就会一直崩溃:
6 libboost_python.dylib 0x000000010aa7cc3e boost::python::detail::init_module(PyModuleDef&, void (*)()) + 30 (module.cpp:44)
在提升线 41-46 的 module.cpp 内部:
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 文本编辑器中的新脚本具有导入语句时,崩溃甚至会发生。
有人使用过 Boost.Python 和 Blender 吗?
提前致谢
更新:
在调试模式下构建和 运行ning 搅拌机后,我得到以下状态:
这看起来不对,首先描述了崩溃。
仍在寻找原因...
Blender 本身(以及 oiio 和 osl 库)是使用 boost 构建的,请确保您用于构建 boost-python 的版本与 blender 使用的版本相匹配。由于 blender 已经将 boost 库加载到 ram 中,当您导入 boost-python 时,它将使用已经加载的 boost 库,而不是您构建 boost-python 的那些,如果每个都是不同的版本,它可以导致问题,如果每个选项都是使用不同的选项构建的,它也会导致问题。
如果您自己构建 Blender,还可以构建 OpenImageIO 和 OpenShadingLanguage,以便它们使用相同的增强版本。通过自己构建它们,您可以确保它们都加载您想要使用的版本。检查您的 cmake 或 sconscript 设置是否指向相同的 boost lib 文件。
% ldd blender | 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)
经过大量的反复试验,我成功了!
我将尝试为 OSX 提供有关如何执行此操作的分步教程。
在接下来的几周内,我还将尝试让它在 windows 上运行,并在成功后更新此答案!
步骤 1
从 https://www.python.org/downloads/release/python-342/
安装 python 3.4.2
步骤 2
检查 blender git repo 和来自 blender 的 svn repo(位于 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 的以下设置:
这将自动配置为使用 mac.
上安装的 python 框架构建搅拌机
步骤 4 使用 Python 3.4.2 下载并构建 boost
在这里,您首先必须检查 blender 使用的是哪个版本。
在外部库中,svn 存储库 boost 作为预构建库包含在:
blender-build/lib/darwin-9.x.universal/README
对我来说这是 boost 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 的 addons 文件夹中
这里有一个小小的提示:为了让 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)
您还可以通过在包含 .so 的文件夹中执行以下脚本来检查您的库是否可以在简单的 python 脚本(如 test.py 中使用:
import mylib
print('hello world!')
运行:
python3 test.py
基本上现在你也应该能够在 blender 中执行这个简单的脚本,我就是这样。
我目前试图实现的是构建一个 python 映射到我的 C++ 类 到 Boost.Python。 在此之后,我想在搅拌机附加组件中使用生成的共享库,以便能够利用来自映射 C++ 类.
的现有功能我已经可以构建我的共享库并在 python 中编写示例脚本,它们也在使用我的库。
一切都很好,但问题是,一旦我尝试在附加组件中使用它,一旦我在崩溃报告中添加带有这个小提示的导入语句,Blender 2.74 就会一直崩溃:
6 libboost_python.dylib 0x000000010aa7cc3e boost::python::detail::init_module(PyModuleDef&, void (*)()) + 30 (module.cpp:44)
在提升线 41-46 的 module.cpp 内部:
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 文本编辑器中的新脚本具有导入语句时,崩溃甚至会发生。
有人使用过 Boost.Python 和 Blender 吗?
提前致谢
更新:
在调试模式下构建和 运行ning 搅拌机后,我得到以下状态:
这看起来不对,首先描述了崩溃。 仍在寻找原因...
Blender 本身(以及 oiio 和 osl 库)是使用 boost 构建的,请确保您用于构建 boost-python 的版本与 blender 使用的版本相匹配。由于 blender 已经将 boost 库加载到 ram 中,当您导入 boost-python 时,它将使用已经加载的 boost 库,而不是您构建 boost-python 的那些,如果每个都是不同的版本,它可以导致问题,如果每个选项都是使用不同的选项构建的,它也会导致问题。
如果您自己构建 Blender,还可以构建 OpenImageIO 和 OpenShadingLanguage,以便它们使用相同的增强版本。通过自己构建它们,您可以确保它们都加载您想要使用的版本。检查您的 cmake 或 sconscript 设置是否指向相同的 boost lib 文件。
% ldd blender | 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)
经过大量的反复试验,我成功了! 我将尝试为 OSX 提供有关如何执行此操作的分步教程。 在接下来的几周内,我还将尝试让它在 windows 上运行,并在成功后更新此答案!
步骤 1 从 https://www.python.org/downloads/release/python-342/
安装 python 3.4.2步骤 2 检查 blender git repo 和来自 blender 的 svn repo(位于 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 的以下设置:
步骤 4 使用 Python 3.4.2 下载并构建 boost 在这里,您首先必须检查 blender 使用的是哪个版本。 在外部库中,svn 存储库 boost 作为预构建库包含在:
blender-build/lib/darwin-9.x.universal/README
对我来说这是 boost 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 的 addons 文件夹中 这里有一个小小的提示:为了让 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)
您还可以通过在包含 .so 的文件夹中执行以下脚本来检查您的库是否可以在简单的 python 脚本(如 test.py 中使用:
import mylib
print('hello world!')
运行:
python3 test.py
基本上现在你也应该能够在 blender 中执行这个简单的脚本,我就是这样。