如何在python脚本中使用Pybind11修改/访问C++指针
How to modify/access a C++ pointer using Pybind11 in a python script?
我们正尝试将Python作为脚本语言嵌入到使用C++构建的游戏引擎中。该问题摘要如下:
在 python 中调用返回指针的 C++ 函数会导致空对象。我们想从这个指针直接调用/修改函数/变量。
游戏对象是在调用 Python Start()
行为时传递的C++类。但是,在此游戏对象上调用任何方法(返回指针(都会导致空引用。
我们如何将 C++ 函数绑定到 python 模块,以便它返回一个有效的指针(由 C++ 和 python 共享(?
我们在绑定时尝试了各种退货政策类型,但似乎都不起作用。例如:return_value_policy::reference
,return_value_policy::reference_internal
MusicComponent* GetMusicComponent()
{
assert(HasComponent<MusicComponent>() && "Does not have component.");
auto ptr(componentArray[GetComponentTypeID<MusicComponent>()]);
return dynamic_cast<MusicComponent*>(ptr);
}
Python 绑定实现 //Unique pointer because the destructor and constructor are private
py::class_<Gameobject , std::unique_ptr<Gameobject, py::nodelete>>gameobject (IridiumModule, "GameObject");
gameobject.def("GetMusicComponent", &Gameobject::GetMusicComponent, py::return_value_policy::automatic_reference);
蟒蛇脚本 class PyScriptComponent():
def Start(gameObject):
comp = gameObject.GetMusicComponent()
print(comp) #prints none
comp.PlayMusic() #error: null reference
公开音乐组件 PYBIND11_MODULE(IridiumPython, IridiumModule)
{
py::class_<MusicComponent>musicComponent (IridiumModule, "MusicComponent" , baseComponent);
baseComponent.def(py::init<Gameobject*>());
musicComponent.def("PlayMusic", &MusicComponent::PlayMusic);
}
在引擎中调用 python 函数 pyObject.attr("Start")(GetGameobject());
思考这个问题的另一种方式可能是使用 PYBIND11_EMBEDDED_MODULE
,而不是在 Python 和 C++ 之间共享指针。
https://pybind11.readthedocs.io/en/stable/advanced/embedding.html#adding-embedded-modules
这样,该类将被"嵌入"到内置的python模块中,您可以拥有一个由Python和C++共享的类,因此可以由其中任何一个进行修改。
但是,在这种情况下,我希望return_value_policy::reference
为您工作。有可能因为它被包装在一个std::unique_ptr
中,资源在C++在 Python 中使用之前被清理,这就是你得到一个空引用的原因。
也许GetMusicComponent应该返回一个unique_ptr而不是一个原始指针?
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- Pybind11:将元组列表从Python传递到C++
- 独立读取-修改-写入顺序
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我可以通过引用修改常量返回
- 对于结构,表达式必须是可修改的ivalue
- 用pybind11包装C++抽象类时出错
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 使用Pybind11向Python公开Eigen::张量
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 修改创建帐户程序
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 如何在C++中使用pybind11加载一个pickle python列表
- 如何从子成员函数修改父公共成员变量
- 修改 VS Code 中的默认C++代码段
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 如何使用递归打印修改后的星号三角形图案
- 如何在python脚本中使用Pybind11修改/访问C++指针