使用pybind11开发python扩展库

Posted caimouse

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用pybind11开发python扩展库相关的知识,希望对你有一定的参考价值。

相对前面的函数返回值时的策略相比,其实还有调用策略,也就是保证函数调用时参数的生存期和状态。

保持策略(Keep alive)

大多数情况下,这种策略都是应用于容器与容器中的元素的生命周期处理。因为当容器还在生存周期中,而其中保持的元素失效了,那么就会发生灾难性的问题,这时候去访问这样的元素,就会导致程序出错。因此pybind11提供了一个方法让函数调用时的参数,保持与容器的生命周期一样长。

比如引用函数keep_alive,这个函数的作用就是让病人Patient保持生存周期至少要长过护士Nurse。函数keep_alive使用数字来标记参数,0是表示返回值,1是表示第一个参数,2是表示第二个参数,依次类推。如果在类里的方法,那么1是表示this指针,而其它参数是从2开始。

这些调用策略是可以多个一起使用,如果运行时,发现Nurse为None值时,它什么也不做。

如果Nurse不是pybind11支持的类型,就会采用弱用机制来实现;如果弱引用机制也不支持的类型,那就会抛出异常。

我们来看下面的例子:

py::class_<List>(m, "List")
    .def("append", &List::append, py::keep_alive<1, 2>());

在这里,就绑定了列表函数append添加的元素,让元素的生命周期大于列表的生命周期。1是代表this指针,也就是容器List。2是表示append添加的参数。通过这样处理之后,所有列表里的元素都能正常访问,不会出现失效的情况

以上是关于使用pybind11开发python扩展库的主要内容,如果未能解决你的问题,请参考以下文章

使用pybind11开发python扩展库

使用pybind11开发python扩展库

使用pybind11来快速开发python程序扩展库

使用pybind11开发python扩展库

使用pybind11开发python扩展库

使用pybind11开发python扩展库