python如何實(shí)現(xiàn)簡(jiǎn)單調(diào)用c++庫(kù)
在 Python 中調(diào)用 C++ 庫(kù),通常有以下幾種方式:
1. 實(shí)現(xiàn)方式
1. 使用 ctypes
適用于 C 風(fēng)格的函數(shù)接口。可以用于調(diào)用編譯為 `.so`(Linux)或 `.dll`(Windows)的庫(kù)。
步驟:
1. 將 C++ 編譯為動(dòng)態(tài)鏈接庫(kù),并使用 `extern "C"` 導(dǎo)出函數(shù)。
2. 在 Python 中使用 `ctypes` 加載并調(diào)用這些函數(shù)。
示例:C++ 文件 (add.cpp)
// add.cpp
#include <iostream>
extern "C" {
int add(int a, int b) {
return a + b;
}
}編譯成共享庫(kù)
g++ -shared -fPIC -o libadd.so add.cpp
Python 調(diào)用代碼
import ctypes
# 加載 DLL/so
lib = ctypes.CDLL('./libadd.so')
# 設(shè)置參數(shù)類型和返回值類型(可選但推薦)
lib.add.argtypes = [ctypes.c_int, cypes.c_int]
lib.add.restype = ctypes.c_int
result = lib.add(3, 4)
print("Result from C++:", result) # 輸出: Result from C++ :72. 使用 cffi 或 c擴(kuò)展模塊
- cffi: 更現(xiàn)代的 FFI 方法,支持 C 接口。
- 編寫(xiě) C/C++ 擴(kuò)展模塊:適合性能關(guān)鍵部分。
不如 PyBind11 簡(jiǎn)潔,這里略過(guò)。
3. 使用 PyBind11
最推薦的方式,專為 Python 和 C++ 混合編程設(shè)計(jì),功能強(qiáng)大且簡(jiǎn)潔。
步驟:
1. 安裝 pybind11:
pip install pybind11
2. 寫(xiě)一個(gè)封裝了 C++ 的綁定文件。
3. 編譯生成 `.pyd` 或 `.so` 文件供 Python import。
示例:C++ 文件 (example.cpp)
#include <pybind11/pybind11.h>
int add(int i, int j) {
return i + j;
}
PYBIND11_MODULE(example, m) {
m.def("add", &add, "A function that adds two numbers");
}編譯方法 1:使用命令行
c++ -O3 -Wall -shared -std=c++11 -fPIC `python3 -m pybind11 --includes` example.cpp -o example$(python3-config --extension-suffix)
Python 調(diào)用
import example print(example.add(3, 4)) # 輸出: 7
4. 使用 SWIG
適合大型項(xiàng)目,但學(xué)習(xí)成本稍高。
小結(jié)

2. 使用pybind11封裝一個(gè)C++類
使用 PyBind11 封裝 C++ 類是一個(gè)相對(duì)直接的過(guò)程,它允許你將 C++ 類暴露給 Python 代碼。下面我將展示如何使用 PyBind11 來(lái)封裝一個(gè)簡(jiǎn)單的 C++ 類。
示例
假設(shè)我們有一個(gè)簡(jiǎn)單的 C++ 類 Rectangle,它有兩個(gè)方法:計(jì)算矩形的面積和周長(zhǎng)。
C++ 文件 (rectangle.cpp)```cpp
#include <pybind11/pybind11.h>
namespace py = pybind11;
class Rectangle {
public:
Rectangle(double width, double height) : width_(width), height_(height) {}
double area() const {
return width_ * height_;
}
double perimeter() const {
return 2 * (width_ + height_);
}
private:
double width_, height_;
};
PYBIND11_MODULE(rectangle_module, m) {
py::class_<Rectangle>(m, "Rectangle") // 綁定類
.def(py::init<double, double>()) // 綁定構(gòu)造函數(shù)
.def("area", &Rectangle::area) // 綁定成員函數(shù)
.def("perimeter", &Rectangle::perimeter); // 綁定成員函數(shù)
}在這個(gè)例子中:
- py::class_<Rectangle> 定義了要暴露給 Python 的 C++ 類。
- .def(py::init<double, double>()) 指定了如何創(chuàng)建這個(gè)類的對(duì)象(即它的構(gòu)造函數(shù))。
- .def("area", &Rectangle::area) 和 .def("perimeter", &Rectangle::perimeter) 分別綁定了類的方法 area 和 perimeter 到 Python 中。
Python 調(diào)用
一旦編譯完成,你就可以像導(dǎo)入任何其他 Python 模塊一樣導(dǎo)入并使用這個(gè)新模塊:
import rectangle_module
rect = rectangle_module.Rectangle(5, 4)
print(f"Area: {rect.area()}") # 輸出: Area: 20
print(f"Perimeter: {rect.perimeter()}") # 輸出: Perimeter: 183.Windows 上配置環(huán)境
準(zhǔn)備工作
1. 安裝 Visual Studio:確保你已經(jīng)安裝了 Visual Studio,并且包含“使用 C++ 的桌面開(kāi)發(fā)”工作負(fù)載。
2. 安裝 Python:下載并安裝適合你項(xiàng)目的 Python 版本。
3.下載Pybind11庫(kù),這是一個(gè)僅包含頭文件的輕量級(jí)庫(kù),使用起來(lái)非常方便。可以在Github下載其Release版本 pybind11 可以參考:官方文檔
配置 Visual Studio 項(xiàng)目
1. 創(chuàng)建一個(gè)新的空項(xiàng)目。
2. 添加源文件:將上述 C++ 代碼保存為 `example.cpp` 并添加到你的 Visual Studio 項(xiàng)目中。
3. 配置項(xiàng)目屬性:
- C/C++ -> 常規(guī) -> 附加包含目錄:添加 pybind11/include 的路徑,以及 Python 的 include 目錄。
- 鏈接器 -> 常規(guī) -> 附加庫(kù)目錄:添加 Python 的 lib 目錄路徑。
- 鏈接器 -> 輸入 -> 附加依賴項(xiàng):添加 pythonXY.lib(其中 XY 是你的 Python 版本號(hào),例如 python39.lib 對(duì)于 Python 3.9)。
4. 設(shè)置輸出類型:右鍵點(diǎn)擊項(xiàng)目 -> 屬性 -> 配置屬性 -> 常規(guī) -> 配置類型,選擇“動(dòng)態(tài)庫(kù)(.dll)”。
5. 編譯項(xiàng)目:選擇合適的配置(Debug 或 Release),然后編譯項(xiàng)目。確保在項(xiàng)目屬性中將目標(biāo)擴(kuò)展名設(shè)置為 .pyd(這是 Python 在 Windows 上使用的擴(kuò)展名),或者生成的 .dll 文件需要重命名為 .pyd ,其才能被 Python 正確識(shí)別。
這樣,你就成功地在 Windows 上使用 Python 調(diào)用了 C++ 庫(kù)。通過(guò)這種方式,你可以將復(fù)雜的 C++ 功能集成到 Python 應(yīng)用程序中。對(duì)于更復(fù)雜的項(xiàng)目或類的封裝,邏輯大致相同,但可能需要更多的細(xì)節(jié)配置。
到此這篇關(guān)于python如何實(shí)現(xiàn)簡(jiǎn)單調(diào)用c++庫(kù)的文章就介紹到這了,更多相關(guān)python調(diào)用c++庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python利用matplotlib實(shí)現(xiàn)制作動(dòng)態(tài)條形圖
說(shuō)到用 Python 制作動(dòng)態(tài)圖,首先想到的肯定是一些直接拿來(lái)就用的庫(kù),雖然我沒(méi)做過(guò),但是我相信一定有且不止一個(gè),搜了一圈后發(fā)現(xiàn)有個(gè)bar chart race庫(kù)看起來(lái)不錯(cuò),感興趣的可以跟隨小編一起學(xué)習(xí)一下2022-10-10
淺談tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意點(diǎn)
這篇文章主要介紹了淺談tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
win10環(huán)境下python3.5安裝步驟圖文教程
本文通過(guò)圖文并茂的形式給大家介紹了win10環(huán)境下python3.5安裝步驟,需要的朋友可以參考下2017-02-02
利用Opencv實(shí)現(xiàn)圖片的油畫(huà)特效實(shí)例
這篇文章主要給大家介紹了關(guān)于利用Opencv實(shí)現(xiàn)圖片的油畫(huà)特效的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
Python實(shí)現(xiàn)運(yùn)行其他程序的四種方式實(shí)例分析
這篇文章主要介紹了Python實(shí)現(xiàn)運(yùn)行其他程序的四種方式,結(jié)合實(shí)例形式分析了Python執(zhí)行其他程序相關(guān)模塊與函數(shù)使用技巧,需要的朋友可以參考下2017-08-08
詳解pytest實(shí)現(xiàn)mark標(biāo)記功能詳細(xì)介紹
這篇文章主要介紹了詳解pytest實(shí)現(xiàn)mark標(biāo)記功能詳細(xì)介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

