目录
快速开始
建立Hello World
暴露类
构造函数
类的数据成员
类属性
遗产
类虚函数
具有默认实现的虚函数
类操作符/特殊功能
功能
呼叫政策
超载
默认参数
自动重载
对象接口
基本界面
派生对象类型
提取C ++对象
枚举
从PyObject *创建boost :: python :: object
嵌入
使用解释器
迭代器
例外翻译
一般技术
创建包
在Python中扩展包装对象
缩短编译时间
快速开始
Boost Python Library是一个用于连接Python和C ++的框架。 它允许您快速无缝地将C ++类函数和对象公开给Python,反之亦然,不使用特殊工具 - 只需使用C ++编译器。 它旨在非侵入性地包装C ++接口,因此您不必更改C ++代码以包装它,使Boost.Python成为将第三方库公开给Python的理想选择。 该库使用高级元编程技术简化了用户的语法,因此包装代码具有一种声明性接口定义语言(IDL)的外观。
Hello World
遵循C / C ++传统,让我们从“你好,世界”开始吧。 一个C ++函数:
char const* greet()
{
return "hello, world";
}
在使用的过程中经常会返回获取的字符串,如果使用上面的方法会导致返回的字符串是乱码,非法指针
虽然官网给出的是char * 类型,这个只适用于返回的是字符串常量,如果返回的是string变量需要使用下面的方法。但是博主建议用的时候还是用std::string。
std::string greet()
{
return "hello, world";
}
可以通过编写Boost.Python包装器来暴露给Python:
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}
而已。 我们完成了。 我们现在可以将其构建为共享库。 现在可以看到生成的DLL。 这是一个Python会话示例:
>>> import hello_ext
>>> print hello_ext.greet()
hello, world
注意事项: 操作过程遇到的工程问题
1、默认情况下,python库是动态链接的,需要定义一个静态链接的宏,BOOST_PYTHON_STATIC_LIB
否则会报: fatal error LNK1104: 无法打开文件“boost_python-vc140-mt-gd-1_61.lib”,这个是链接动态库的情况
2、生成的c++动态库dll,python怎么导入呢,官方教程里没有给出具体方法,直说可见
把dll的后缀改成pyd,再导入就可以直接用了
3、报找不到模块错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'PYWrapper'Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define module export function (PyInit_PYWra
pper)
BOOST_PYTHON_MODULE中模块名称必须跟pyd的动态库名称一致。