pybind11 win10 环境搭建及开发流程简介

0、 背景介绍

如果有整合python和C++两种语言的优点的需求,如:python自动化测试C++ Library、python调用C++ 现有Library、或者利用C++给python做加速的需求,pybind11是一个很好的选择。

pybind11 可实现 C++11 和 Python 之间的无缝操作。
pybind11 是一个轻量级的只包含一组头文件的 C++ 库,可以在 Python 中使用 C++ 类型。主要用于创建已有 C++ 代码的 Python 封装版本。其目的和语法类似于 Boost.Python 库。为什么要创建这个项目的原因就是因为 Boost 。作者认为 Boost 很大很复杂。而目前的 C++11 兼容的编译器使用已经非常广泛,所以希望开发一个更轻量级更具备兼容性的项目。

除去注释之外,该项目的核心头文件只有 2500 行左右代码,依赖于 Python (2.7 或者 3.x) 和标准 C++ 库。这么精简的实现有赖于新的 C++11 语言特性。特别是元组、Lambda 函数以及可变模板。自从项目创建以来,其增长已经超过了 Boost.Python。

当然还有其它的选择,可以参见 python/C++ 混合编程__方案调研

1、 环境配置

查看网上windows系统下的环境配置的文档,编译环节主要在visual studio上面,环境配置过程比较复杂,多次尝试后仍然没有成功。后来发现可以在python环境下进行编译,特将该方法整理出来分享给大家。

平时主要工作在python平台,因此这里的环境配置主要针对python用户,对于C++模块的编译和导入主要在python平台下进行,运行环境如下:

win10
Anaconda-201910;
spyder-4.1.3;
python 3.7;
Visual C++ Bulid Tools 2019;
  • 首先,安装anaconda 和visual studio;

  • 在conda中安装pybind11 的虚拟环境
    打开anaconda prompt, 运行:
    conda create -n env_pybind11 python=3.7 spyder numpy pandas scipy matplotlib pybind11

  • 然后激活虚拟环境: env_pybind11
    conda activate env_pybind11

  • 至此,环境安装结束

2、开发流程

pybind11 win10 环境搭建及开发流程简介_第1张图片

编译C++代码作为python动态链接库的开发过程如上。

cpp demo

// filename: first_pybind11.cpp
//note: 将func.cpp模块 和 func_warp.cpp 合并到一个文件
#include 

namespace py = pybind11;
// define func 
int add(int i=1, int j=2) {
    return i + j;
}

//warper of the func 
PYBIND11_MODULE(example_var, m) {
    m.doc() = "pybind11 example plugin"; // optional module docstring

    m.def("add", &add, "A function which adds two numbers",
            py::arg("i")=1, py::arg("j")=2
            );
    m.attr("the_answer") = 42;
    py::object world = py::cast("World");
    m.attr("what") = world;
}

python setup

# -*- coding: utf-8 -*-
"""
Created on Tue May 12 17:32:25 2020

@author: dell
"""

#Filename: setup.py

from setuptools import setup, Extension

functions_module = Extension(
    name ='example_var',
    sources = ['first_pybind.cpp'],
    include_dirs = ['F:\\Anaconda\\Anaconda3_201910\\envs\\env_pybind11\\lib\\site-packages\\pybind11\\include',
                   'F:\\Anaconda\\Anaconda3_201910\\envs\\env_pybind11\\include']
# include_dirs 中的路径 更改为自己虚拟环境下相应 pybind11的路径 和 python的include路径
)

setup(ext_modules = [functions_module])

进行编译

在虚拟环境 env_pybind11 的cmd命令行中,进入目标路径,执行:
python setup.py build_ext --inplace
pybind11 win10 环境搭建及开发流程简介_第2张图片
如上图,表示C++代码编译成功。
编译过程会自动使用visual studio的编译工具进行编译

python导入相应的动态链接库

在spyder中执行如下文件:

#File name: test.py
import example_var

print(example_var.add(1, 2))
example_var.add(i=1, j=3)

help(example_var.add)
"""
help(example.add)

Help on built-in function add in module example:

add(...) method of builtins.PyCapsule instance
    add(i: int, j: int) -> int

    A function which adds two numbers
"""
example_var.add(i=1, j=9)
print(example_var.what)
print(example_var.the_answer)

如未报错表明动态链接库生成成功。

3. 参考:

官网其他的环境配置和编译方式
本文参考链接《Using pybind11 under window》
官网教程简例

如果喜欢,欢迎点赞收藏。

你可能感兴趣的:(python,C++,混合编程,pybind11,C/C++)