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. Page Visibility API

    在code review时看见同事使用visibilitychange 事件来监听页面的隐藏与显示,之前没有了解过这块,学习一下. document.visibilityState 主要有以下3个状态 ...

  2. PHP0010:PHP操作mysql

    cmd中清除之前的记录 cmd操作数据库的步骤: php 到 mysql的并发数 15个左右 for循环是要知道起点和终点 foreach是从结果集中取数据 而while可遍历自然结果集

  3. Java出现次数最多的整数

    描述 编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20.然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来.如果有两个元 ...

  4. JavaSE学习笔记(3)---面向对象三大特性

    JavaSE学习笔记(3)---面向对象三大特性 面向对象的三大特征:继承.封装.多态 1.封装 面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改.然 ...

  5. 纪中5日T3 1566. 幸运锁(lucky.pas/c/cpp)

    1566. 幸运锁(lucky.pas/c/cpp) 题目描述 有一把幸运锁,打开它将会给你带来好运,但开锁时需要输入一个正整数(没有前导0).幸运锁有一种运算,对于一个正整数,返回他的相邻两位数字间 ...

  6. java回文代码

    import java.util.*; import java.math.BigInteger; import java.util.Scanner; public class Test{ static ...

  7. Oracle 12c 如何在 PDB 中添加 SCOTT 模式(数据泵方式)

    Oracle 12c 建库后,没有 scott 模式,本篇使用数据泵方式,在12c版本之前数据库中 expdp 导出 scott 模式,并连接 12c 的 pdb 进行 impdp 导入. 目录 1. ...

  8. C# extract img url from web content then download the img

    static void Main(string[] args) { WebClientDemo(); Console.ReadLine(); } static void WebClientDemo() ...

  9. 使用Vue实现一个树组件

    HTML代码: <!DOCTYPE html> <html> <head> <title>Vue Demo</title> <meta ...

  10. pytest-pytest-html生成HTML测试报告

    pytest-HTML是一个插件,pytest用于生成测试结果的HTML报告.兼容Python 2.7,3.6 pytest-html 1.github上源码地址[https://github.com ...