Pybind11实践
安装 pybind11
$ brew install pybind11
# or
$ pip install pybind11
从 C++ 调用 Python
编辑 CMakeLists.txt
文件
project(pybind_demo)
cmake_minimum_required(VERSION 3.13)
set(CMAKE_CXX_STANDARD 14)
include(FetchContent)
FetchContent_Declare(
pybind11
GIT_REPOSITORY https://github.com/pybind/pybind11.git
GIT_TAG v2.6.2
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(pybind11)
add_executable(demo demo.cpp)
target_link_libraries(demo PRIVATE pybind11::embed)
编辑 demo.cpp
文件
#include <iostream>
#include <pybind11/embed.h>
namespace py = pybind11;
using namespace std;
int main()
{
cout << "Hello PyBind World" << endl;
// start the interpreter and keep it alive
py::scoped_interpreter guard{};
py::module math = py::module::import("math");
py::object result = math.attr("sqrt")(25);
std::cout << "Sqrt of 25 is: " << result.cast<float>() << std::endl;
}
从 Python 调用 C++
编辑 C++ 源文件
#include <pybind11/embed.h>
int multiply(int i, int j) {
return i * j;
}
PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 example plugin"; // optional module docstring
m.def("multiply", &multiply, "A function which multiplies two numbers");
}
编辑 CMakeLists.txt
文件
cmake_minimum_required(VERSION 3.13)
project(pybind_demo)
set(CMAKE_CXX_STANDARD 14)
include(FetchContent)
FetchContent_Declare(
pybind11
GIT_REPOSITORY https://github.com/pybind/pybind11.git
GIT_TAG v2.6.2
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(pybind11)
pybind11_add_module(example example.cpp)
target_compile_features(example PUBLIC cxx_std_14)
set_target_properties(example PROPERTIES SUFFIX ".so")
测试执行
import example
out = example.multiply(3, 2)
print("Multiply product is: %s" % out)