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})