簡體   English   中英

使用Boost.Python構建共享庫並通過Python將其導入Blender

[英]Using Boost.Python to build a shared lib and import it in Blender through Python

我目前試圖實現的目標是通過Boost.Python構建我的C ++類的python映射。 之后,我想在Blender附加組件中使用生成的共享庫,以便能夠利用來自映射的C ++類的現有功能。

我已經可以構建共享庫並使用python編寫示例腳本,而python也在使用我的庫。

此處一切正常,但問題在於,當我嘗試在附加組件中使用它時,一旦我在崩潰報告中添加帶有此小提示的import語句,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版本。

我真的不知道接下來要嘗試什么,因為在獨立模式下一切都按預期工作。 同樣,當我在具有import語句的Blenders Text Editor中運行新腳本時,甚至發生崩潰的事實。

有人對Boost.Python和Blender有經驗嗎?

提前致謝

更新:在調試模式下構建和運行Blender之后,我得到以下狀態: 在此處輸入圖片說明

這看起來不正確,並且首先描述了崩潰。 仍在尋找原因...

Blender本身(以及oiio和osl庫)是使用boost構建的,請確保用於構建boost-python的版本與Blender使用的版本匹配。 由於Blender已將boost庫加載到ram中,因此當您導入boost-python時,它將使用已經加載的boost庫而不是與您構建boost-python一起使用的boost庫,如果每個版本都不相同,則可能會導致問題,如果每個版本都使用不同的選擇也會引起問題。

如果您自己構建攪拌器,則還要構建OpenImageIO和OpenShadingLanguage,以便它們使用相同的Boost版本。 通過自己構建它們,可以確保它們都加載了要使用的版本。 檢查您的cmake或sconscript設置是否指向相同的boost lib文件。

%ldd攪拌機| grep增強
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上運行,並在我成功后更新此答案!

步驟1https://www.python.org/downloads/release/python-342/安裝python 3.4.2

步驟2從Blender中檢出Blender git repo和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的以下設置: python的CMake設置 這將自動配置為使用Mac上已安裝的python框架構建Blender。

步驟4使用Python 3.4.2下載並構建Boost,在這里您首先必須檢查Blender使用的版本。 在外部庫中,svn信息庫boost作為預構建庫包含在:

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構建Blender,並確保它正在使用已安裝的Python 3.4.2

步驟7將您的共享庫復制到blender.app的addons文件夾中。這里有個小小的提示:為了讓python識別您的共享庫,它必須具有擴展名.so而不是.dylib(對於Windows,它是.pyd而不是.dll)!

步驟8重新檢查並檢查Python 3.4.2是否再次編譯了Boost:

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內部執行此簡單腳本,對我來說就是這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM