目录

快速开始

建立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的动态库名称一致。