pybind11
是一个将c++接口转接给python的库,它支持C++ 11标准的编译器。
这里我做了一个简单的实验,主要是验证将Eigen::MatrixXf
类型映射到numpy::ndarray
类型,这样就可以在python
愉快地调用C++
函数了。
完整代码见:https://download.csdn.net/download/weixin_38258767/12301615
首先,python
脚本代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
path_current = os.path.dirname(os.path.abspath(__file__))
path_build = os.path.join(path_current, "../build")
sys.path.append(path_build)
import numpy as np
from PYBIND_TEST import add_matrix
if __name__ == "__main__":
a = np.array([[1,1],[2,2]])
b = np.array([[2,2],[1,1]])
print(add_matrix(a,b))
- 这里的
PYBIND_TEST
是通过pybind11
转接的工程名,add_matrix
是一个矩阵加法。
C++
函数定义:
#include "test.h"
using MatType = Eigen::Matrix2f;
MatType add_matrix(MatType a,MatType b){
return a+b;
}
C++
转接脚本bind.cpp
:
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include "test.h"
PYBIND11_MODULE(PYBIND_TEST,m)
{
m.def("add_matrix", add_matrix,
pybind11::arg("a"),
pybind11::arg("b"));
}
CMakeLists.txt
:
cmake_minimum_required(VERSION 2.8)
project(pybind11_test)
set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -O2 ${OpenMP_CXX_FLAGS}")
set(PYBIND11_CPP_STANDARD -std=c++11)
find_package(PythonInterp REQUIRED)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/pybind11/)
set(SOURCEFILES src/test.cpp )
pybind11_add_module(PYBIND_TEST MODULE bind.cpp ${SOURCEFILES})