使用pybind11开发python扩展库
Posted caimouse
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用pybind11开发python扩展库相关的知识,希望对你有一定的参考价值。
函数
当你要想学习下面的内容之前,一定要先学会前面的内容,比如导出简单的类和函数,这样才有相应的基础来学习下面的内容。
下面介绍的内容适合普通的C++函数,也适合C++里类的函数,以及python里叫做方法的函数。
函数返回值的策略
由于Python和C++采用不同的方法来管理内存,以及对象的生命周期。这样导致了绑定函数刚刚靠返回的类型来解决内存管理和对象生命周期会出问题。为了解决这个问题,pybind11提供了一个返回类型策略来管理内存和对象的生命周期,可以传送给module_::def()和calas_::def()函数。
如果你不指定函数的返回策略,就会默认地使用return_value_policy::automatic。由于返回策略的多样性,必须要针对不同的情况选择合适的返回策略,否则就会出错。
我们来看一下这样的一个例子:
/* Function declaration */
Data *get_data() { return _data; /* (pointer to a static data structure) */ }
...
/* Binding code */
m.def("get_data", &get_data); // <-- KABOOM, will cause crash when called from Python
当从python代码调用get_data之后,程序就会出错,这是什么原因造成的呢?我们来仔细地分析一下这种情况,就明白为什么出错了。在这个例子里,由于_data是一个静态的数据类型,那么它就是全局的变量,不能进行删除的操作,由C++
以上是关于使用pybind11开发python扩展库的主要内容,如果未能解决你的问题,请参考以下文章