python调用C/C++有不少的方法,如boost.python, swig, ctypes, pybind11等,这些方法有繁有简,而pybind11的优点是对C++ 11支持很好,API比较简单,现在我们就简单记下Pybind11的入门操作。

1. pybind11简介与环境安装

pybind11是一个轻量级的只包含头文件的库,它主要是用来在已有的 C++代码的基础上做扩展,它的语法和目标非常像Boost.Python,但Boost.Python为了兼容现有的基本所有的C++编译器而变得非常复杂和庞大,而因此付出的代价是很多晦涩的模板技巧以及很多不必要的对旧版编译器的支持。Pybind11摒弃了这些支持,它只支持python2.7以上以及C++ 11以上的编译器,使得它比Boost.Python更加简洁高效。 
为了使用pybind11,我们需要支持C++ 11标准的编译器(GCC 4.8以上,VS 2015 Update 3以上)以及python 2.7以上的版本,还需要下载CMake,有了这些以后, 
1. 首先,我们从 pybind11 github网址:https://github.com/pybind/pybind11 上下载源码。 
2. cmake工程之前,要先安装pytest pip install pytest,否则会出错 
3. 用CMake编译并运行测试用例:

mkdir build
cd build
cmake ..
cmake --build . --config Release --target check

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

2. python调用C++

下载编译好pybind11之后,我们就可以开始对着官方的pybind11 Tutorial进行学习了,详细的入门教程及语法请参考官方文档,这里,我们简单演示下如何编写供python调用的C++模块. 
首先,我们编写一个C++源文件,命名为example.cpp

 #include <pybind11/pybind11.h>
namespace py = pybind11; int add(int i, int j)
{
return i + j;
} PYBIND11_MODULE(example, m)
{
// optional module docstring
m.doc() = "pybind11 example plugin";
// expose add function, and add keyword arguments and default arguments
m.def("add", &add, "A function which adds two numbers", py::arg("i")=, py::arg("j")=); // exporting variables
m.attr("the_answer") = ;
py::object world = py::cast("World");
m.attr("what") = world;
}

2.1 编译

然后,在windows下使用工具vs2015 x86 Native Tools Command Prompt (因为我的python是32位版本,如果是64位版本的,请使用vs2015 x64 Native Tools Command Prompt)进行编译: 

cl example.cpp /I "H:/Allfiles/pybind11/include" /I "C:/Python27/include" /LD /Fe:example.pyd /link/LIBPATH:"C:/python27/libs/" 

编译成功后,会在example.cpp相同目录下生成example.pyd文件,这个就是python可以直接导入的库,运行:

 import example
example.add(3, 4) [out]: 7

有了编译成功的模块,便可以使用我在另一篇博客Python模块搜索路径中提到的方法,将其用.pth或者PYTHONPATH的方法加入到python搜索路径,以后在我们自己的环境中就可以随时随地使用这个模块啦。

2.2 CMake的编译方法

当然,我们也可以使用CMake进行编译。首先写一个CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12)
project(example) add_subdirectory(pybind11)
pybind11_add_module(example example.cpp)

这里要求example.cpp放在和pybind11同一级的目录下,然后CMake,便会生成一个vs 2015的工程文件,用vs打开工程文件进行build,就可以生成example.pyd了。

3. C++调用python

使用pybind11,也很容易从C++里调用python脚本: 
首先,我们用vs 2015新建一个工程,并且将Python的包含目录和库目录,以及pybind11的包含目录配置到工程,我的配置如下:

然后,新建一个源文件example.cpp:

 #include <pybind11/embed.h>
#include <iostream> namespace py = pybind11; int main() {
py::scoped_interpreter python; //py::module sys = py::module::import("sys");
//py::print(sys.attr("path")); py::module t = py::module::import("example");
t.attr("add")(, );
return ;
}

最后,在工程目录下加入脚本example.py:

 def add(i, j):
print("hello, pybind11")
return i+j

运行工程,得到如下的结果:

hello, pybind11

运行成功!!!

总结

本文中我们简单介绍了怎么使用pybind11进行python和C++的相互调用,这些只是入门级别的例子,但是可以work了,这很重要。深入进行研究使用,还是等以后用到再说吧。

参考文献

    1. pybind11 github
    2. pybind11 Tutorial
    3. C++与Python的互操作
    4. Building and testing a hybrid Python/C++ package

原文连接:https://blog.csdn.net/fitzzhang/article/details/78988682

pybind11简介的更多相关文章

  1. python调用C++之pybind11入门(相互调用)

    python调用C/C++有不少的方法,如boost.python, swig, ctypes, pybind11等,这些方法有繁有简,而pybind11的优点是对C++ 11支持很好,API比较简单 ...

  2. 混合编程:如何用python11调用C++

    摘要:在实际开发过程中,免不了涉及到混合编程,比如,对于python这种脚本语言,性能还是有限的,在一些对性能要求高的情景下面,还是需要使用c/c++来完成. 那怎样做呢?我们能使用pybind11作 ...

  3. ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...

  4. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  5. Cassandra简介

    在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...

  6. REST简介

    一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...

  7. Microservice架构模式简介

    在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...

  8. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  9. HTTPS简介

    一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...

随机推荐

  1. 吴裕雄--天生自然 PYTHON数据分析:糖尿病视网膜病变数据分析(完整版)

    # This Python 3 environment comes with many helpful analytics libraries installed # It is defined by ...

  2. MySQL manager or server PID file could not be found!

    [root@centos var]# service mysqld stop MySQL manager or server PID file could not be found!       [F ...

  3. 连接数据库的工具JdbcUtil

    public class JdbcUtil { private static String driver=null;//驱动 private static String url=null;//连接地址 ...

  4. “石家庄铁道大学软件工程系学生学籍管理系统2019版”java小程序制作分享

    首先附上完整代码: import java.util.Scanner; public class SocreInformation { public SocreInformation(){}; pub ...

  5. mac自带功能超详细介绍

    mac自带的超实用的功能分享给大家,包含自带的Spotlight(聚焦) 计算器功能,预览的 PDF 压缩功能,切换同一应用的不同窗口等,让您的工作更加轻松. 1.Spotlight(聚焦) 计算器功 ...

  6. Linux一些基本命令、inode定义、软硬链接

    1.创建普通文件命令:touch 命令 2.创建目录文件命令:mkdir 命令 3.删除普通文件命令:rm 命令 4.删除目录文件命令:rmdir 命令 5.给普通文件写东西命令:vim 命令 6.查 ...

  7. 牛客网——剑指offer(跳台阶以及变态跳台阶_java实现)

    首先说一个剪枝的概念: 剪枝出现在递归和类递归程序里,因为递归操作用图来表示就是一棵树,树有很多分叉,如果不作处理,就有很多重复分叉,会降低效率,如果能把这些分叉先行记录下来,就可以大大提升效率——这 ...

  8. linux执行计划任务at命令

    https://www.jianshu.com/p/17f5aa01853f 在linux计划任务中, cron 是周期性运行某任务,假如我只想在未来的某时间点只是要求任务运行一次,这就用到at命令了 ...

  9. linux多线程编程的应用场景

  10. 机器学习作业(一)线性回归——Python(numpy)实现

    题目太长啦!文档下载[传送门] 第1题 简述:设计一个5*5的单位矩阵. import numpy as np A = np.eye(5) print(A) 运行结果: 第2题 简述:实现单变量线性回 ...