前言
為了使用C++ 編寫python的擴展程序, 需要使用pybind11, pybind11使用比較簡單,文檔也比較詳細。下面本人分別在Ubuntu和Windows系統(tǒng)上測試使用pybind11
開發(fā)/測試環(huán)境
Ubuntu系統(tǒng)
- Ubuntu 18.04
- pybind11
- Anaconda3, with python 3.6
- cmake
Windows系統(tǒng)
- win10 64bit
- Microsoft Visual Studio 2017
- Anaconda3, with python 3.7
pybind11
https://github.com/pybind/pybind11
安裝配置
下載pybind11
git clone https://github.com/pybind/pybind11.git
安裝pytest
pip install pytest
編譯安裝
mkdir build
cd build
cmake ..
cmake --build . --config Release --target check
編譯好的動態(tài)庫
編譯pybind11文檔
在doc目錄下
make html
Ctrl + H
顯示隱藏文件
Windows系統(tǒng)
Requires
- Microsoft Visaul Studio 2017 x64
- Anaconda3 , with python 3.7
Pybind11配置安裝
首先直接下載pybind11
https://github.com/pybind/pybind11
pybind11是 header-only的,因此不需要編譯動態(tài)鏈接庫铸豁,直接使用即可。
使用VS2017測試
使用C++編寫python擴展(python調(diào)用C++)
新建一個vs c++工程
工程配置:
- 設(shè)置編譯輸出類型
- 添加include包含
- 添加lib路徑
- 鏈接器添加lib
1. 編譯輸出類型
2. include包含路徑
- python/include
-
pybind11/include
3. lib路徑
4. 鏈接器配置
C++代碼
很簡單的一個代碼箫章,編寫一個python擴展模塊,模塊中包含一個函數(shù)foo()
這是一個lamda
函數(shù)。
#include<pybind11/pybind11.h>
namespace py = pybind11;
PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 example module";
// Add bindings here
m.def("foo", []() {
return "Hello, World!";
});
}
編譯生成pyd, lib
(改名為example)
測試pyd擴展
首先,打開至x64/Release目錄豺旬, 打開power shell窗口:
然后,輸入python
打開python解釋器:
輸入python代碼:
import example
print(example.foo())
繼續(xù)寫一個復(fù)雜的例子
計算加柒凉,減,乘篓跛,除
#include<pybind11/pybind11.h>
namespace py = pybind11;
PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 example module";
// Add bindings here
m.def("foo", []() {
return "Hello, World!";
});
m.def("foo2", []() {
return "This is foo2!\n";
});
m.def("add", [](int a, int b) {
return a + b;
});
m.def("sub", [](int a, int b) {
return a - b;
});
m.def("mul", [](int a, int b) {
return a * b;
});
m.def("div", [](int a, int b) {
return static_cast<float>(a) / b;
});
}
示例2:
代碼
#include<iostream>
#include<pybind11/pybind11.h>
namespace py = pybind11;
/*
file:///D:/pybind11-master/docs/.build/html/basics.html
*/
# if 1
int add(int a, int b) {
return a + b;
}
int add2(int a, int b) {
return a + b;
}
int add3(int a, int b) {
return a + b;
}
PYBIND11_MODULE(demo2, m) {
m.doc() = "example module";
//函數(shù)名稱膝捞, 函數(shù)指針, 描述
m.def("add", &add, "A function which adds two numbers");
// keyword arguments
//py::arg("a")
m.def("add2", &add2, "A function which adds two numbers", py::arg("a"), py::arg("b"));
//default arguments
m.def("add3", &add3, "A function which adds two numbers", py::arg("a") = 10, py::arg("b") = 5);
//Exporting variables
m.attr("num1") = 100;
py::object world = py::cast("World");
m.attr("what") = world;
}
#endif