Python/C++

Python从设计之初就已经是一门面向对象的语言,面向对象的三大特性是指:封装、继承和多态。

在python创建类是比较方便的。与C++有一些类似。

. python类每个方法中的第一个参数都是self;

. 构造函数的名字是__init__:

 

 

 

附:python与C++类的具体区别

http://www.waitingfy.com/archives/3269

 

1. Pybind11

pybind11是一个轻量级的只包含头文件的库,用于接口转换,它主要是用来在已有的 C++代码的基础上做扩展,用于 Python 和 C++ 之间接口转换。(所有要在代码中增加#include <pybind11/pybind.h>)

它的语法和目标非常像Boost.Python,但Boost.Python为了兼容现有的基本所有的C++编译器而变得非常复杂和庞大,而因此付出的代价是很多晦涩的模板技巧以及很多不必要的对旧版编译器的支持。

Pybind11摒弃了这些支持,它只支持python2.7以上以及C++ 11及以上的编译器,使得它比Boost.Python更加简洁高效。

Requirement: C++11标准编译器,python2.7以上版本,CMake(跨平台、开源平台)

Support: 已经实现了 STL 数据结构、智能指针、类、函数重载、实例方法等到Python的转换,其中函数可以接收和返回自定义数据类型的值、指针或引用。

 

1.0 pybind安装

(a)从 pybind11 github网址:https://github.com/pybind/pybind11 上下载源码。

(b)CMake工程之前,要先安装pytest: pip install pytest,否则会出错。

(c)用CMake编译并运行测试用例:

        

如果所有测试用例都通过了,说明安装成功了。

 

1.1 python调用C++

(a)首先,我们编写一个C++接口转换文件,命名为example.cpp。(此处为简化将C++ add函数实现也放入于此,实际时include相关头文件即可)

           

PYBIND11_MODULE()宏函数将会创建一个函数,在由Python发起import语句时该函数将会被调用

模块名字“example”,由宏的第一个参数指定(千万不能出现引号)。

第二个参数"m",定义了一个py::module的变量。

函数py::module::def()生成绑定代码,将add()函数暴露给Python(类似于引用传参)。

 

(b) 使用CMake进行编译。首先写一个CMakeLists.txt。

          

 

 就是CMakeList.txt和example.cpp放在一个目录下面。然后cmake .,可生成example.cpython-36m-x86_64-linux-gnu.so文件,这个文件就是python可以调用的文件。

在相同目录下运行python,进入python命令行,即可执行。 

            

 

1.1.2 python调用C++类

官方文档:https://pybind11.readthedocs.io/en/stable/advanced/classes.html

          

 暴露C++内部变量:

1. 非私有变量                                                                                               

 .def_readwrite("name", &Pet::name)                                    

                  

2.私有变量

def_property() 会自动调用 setters and getters 方法

 

 1.2 STL与python内建数组的对应关系

在使用python编程时,常使用内建容器作为函数的参数和返回值,python语言的这种特性使我们的程序变得非常灵活和易于理解。

在使用pybind11封装C++ api时,为了保留此灵活度,需要将STL与python的容器进行对应,具体对应如下所示:

                

 

1.3 C++调用python

 

C++ code,此处import了tttt文件:

            

 

python脚本(tttt.py):

           

 

 

 选型参考:https://zyxin.xyz/blog/2019-08/GluePythonCpp/

posted @ 2021-09-06 08:59  Louis93  阅读(403)  评论(1)    收藏  举报