摘要:在实际开发过程中,免不了涉及到混合编程,比如,对于python这种脚本语言,性能还是有限的,在一些对性能要求高的情景下面,还是需要使用c/c++来完成。
那怎样做呢?我们能使用pybind11作为桥梁,pybind11的优点是对C++ 11支持很好,API比较简单,现在我们就简单记下Pybind11的入门操作。
Pybind11 是一个轻量级只包含头文件的库,用于 Python 和 C++ 之间接口转换,可以为现有的 C++ 代码创建 Python 接口绑定。Pybind11 通过 C++ 编译时的自省来推断类型信息,来最大程度地减少传统拓展 Python 模块时繁杂的样板代码, 已经实现了 STL 数据结构、智能指针、类、函数重载、实例方法等到Python的转换,其中函数可以接收和返回自定义数据类型的值、指针或引用。

首先,我们编写一个C++源文件,命名为example.cpp。

PYBIND11_MODULE()宏函数将会创建一个函数,在由Python发起import语句时该函数将会被调用。模块名字“example”,由宏的第一个参数指定(千万不能出现引号)。第二个参数"m",定义了一个py::module的变量。函数py::module::def()生成绑定代码,将add()函数暴露给Python。
我们使用CMake进行编译。首先写一个CMakeLists.txt。

就是CMakeList.txt和example.cpp放在一个目录下面。

会生成example.cpython-36m-x86_64-linux-gnu.so文件。
这个文件就是python可以调用的文件。还是在相同目录下运行python,进入python命令行

在使用python编程时,常使用内建容器作为函数的参数和返回值,python语言的这种特性使我们的程序变得非常灵活和易于理解。那么在使用pybind11封装C++实现的函数的时候,如何保留这一特性呢?本文介绍pybind11实现list和dict作为参数及返回值的方法。

返回vector

写pybind11封装函数

返回struct

写pybind11封装函数

此外:提供一些常用的参考链接
pybind11 — Seamless operability between C++11 and Python
python调用C++之pybind11入门
python调用c++利器–pybind11
基于pybind11实现Python调用c++编写的CV算法–下 (Linux+Cmake)
跟我一起学习pybind11 之一
Passing by value #161
pybind11封装的函数实现内建容器作为参数及返回值
本文分享自华为云社区《混合编程 — python调用C++之pybind11入门》,原文作者:SNHer。
点击关注,第一时间了解华为云新鲜技术~
作者:华为云开发者社区 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。