主要用于C++和python之间的相互调用
是一轻量级仅标头库,语法类似Boost.Python使用编译时自动推断类型
剥离了与绑定生成无关的所有内容,超越Boost.Python 简化了绑定代码
1.2.python中安装:pip install pybind11
1.3.VC中安装:
1.3.1.Windows系统:
Microsoft Visaul Studio 2017 x64
Anaconda3 , with python 3.8
1.3.2.Pybind11安装:
pybind11是 header-only的,因此不需要编译动态链接库,直接使用即可
1)下载pybind11 https://github.com/pybind/pybind11解压到C:\pybind11-master
2)环境变量添加:
C:\ProgramData\Anaconda3;
C:\ProgramData\Anaconda3\Library\mingw-w64\bin;
C:\ProgramData\Anaconda3\Library\usr\bin;
C:\ProgramData\Anaconda3\Library\bin;
C:\ProgramData\Anaconda3\Scripts;
C:\ProgramData\Anaconda3\Lib\site-packages;
C:\ProgramData\Anaconda3\Lib\site-packages\numpy\core\include;
C:\ProgramData\Anaconda3\pkgs\mkl-2020.0-166\Library\bin;
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64;
C:\swigwin;
C:\opencv\build\x64\vc15\bin;
C:\opencv\build\x64\vc15\lib;
C:\opencv\build\include;
C:\opencv\build\include\opencv2;
C:\pybind11-master\include;
3)windows下python环境变量设置
Admin用户变量:PYTHONHOME C:\ProgramData\Anaconda3
PYTHONPATH C:\ProgramData\Anaconda3\Lib\site-packages
2.使用VS2017测试
2.1.使用C++编写python扩展(python调用C++)新建一个vs c++工程
2.2.工程配置:
1)设置编译输出类型
配置属性--常规--常规--目标文件扩展名:.pyd
配置属性--常规--项目默认值-配置类型:动态库.dll
2)添加include包含:
配置属性--VC++目录--常规--包含目录:
C:\pybind11-master\include
C:\ProgramData\Anaconda3\include
3)链接器配置:
链接器-常规-附加库目录:C:\ProgramData\Anaconda3\libs
链接器-输入-附加依赖项:python3.lib
2.3.C++代码编译:
方法1:VS2017
方法2:MinGW64
查看版本:C:\Users\Administrator>g++ --version //8.1.0
编译文件:C:\Users\Administrator\Desktop\ProjectSwigWin\testSwig>compile.bat
生成文件:在当前目录下生成example.pyd;拷贝到python同级目录下
python测试:
#将example.pyd拷贝到python同级目录下
C:\Fastener\Camera\test.py
C:\Fastener\Camera\example.pyd
import Camera.example as e
print(e.add(10,2))#12
print(e.sub(10,2))#8
文件夹结构:
C:\Users\Administrator\Desktop\ProjectSwigWin\testSwig>
example1.h
example1.cpp
example.cpp
compile.bat
文件内容:
//example1.h
#pragma once
int sub(int, int);
//example1.cpp
#include "example1.h"
int sub(int x, int y) { return x - y; }
//example.cpp
#include <pybind11/pybind11.h>
#include "example1.h"
namespace py = pybind11;
int add(int i, int j) {return i + j;}
PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 example plugin"; // optional module docstring
m.def("add", &add, "A function which adds two numbers");
m.def("sub", &sub, "A function which adds two numbers");
//compile.bat
::将多个C++原文件打包成动态库供python调用
::后缀为pyd,模块名要与pybind11中的模块名一致PYBIND11_MODULE(模块名, m)
::作者:tcy
g++ ^
-O3 -Wall -static -shared -std=c++17 ^
-DMS_WIN64 -fPIC -I C:\pybind11-master\include ^
-I C:\ProgramData\Anaconda3\include ^
-L C:\ProgramData\Anaconda3\libs example1.cpp example.cpp ^
-o example.pyd -lPython38
Pybind11算是目前最方便的Python调用C++的工具了, 介绍一下在vs2019上写Python的扩展的HelloWorld
1. 去下载pybind11 https://github.com/pybind/pybind11/releases/tag/v2.3.0
这个库只要include就可以了
2. 用vs新建一个空项目
2.1 调整输出类型为dll, 调整输出文件名为pyd
2.2 include python和pybind11的头文件, 我的python使用anaconda的全家桶
2.3 链接 python的lib
2.4 linker里添加python的lib
本人最近在做图像处理,需要C++和python之间相互转换,用opencv做基础图形处理需要Mat和numpy相互转换,先前用swig,boost.python,及python CAPI
发现都没有pybind11,函数封装非常简洁易懂,采用模板封装,不怎么设置,非常好用,推荐给大家。欢迎大家讨论有什么好的方法共同分享。
1.目录:
1.Windows10 pybind11安装环境配置VS2017,MinGW64编译 tcy
2.Windows10 pybind11 C++导出变量 (tcy)