c++和python聯合編程示例

安裝 C++與 Python 綁定工具

pip install pybind11

這其實相當于使用 python 安裝了一個 c++的庫 pybind11,這個庫只由頭文件構成, 支持基礎數據類型傳遞以及 python 的 numpy 和 c++的 eigen 庫之間的自動轉換。

編寫 CMakeList.txt

cmake_minimum_required(VERSION 3.14)
project(demo)# 設置 C++ 標準
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 查找 pybind11
set(pybind11_DIR "/home/erge/work/python/venv/demo/lib/python3.10/site-packages/pybind11/share/cmake/pybind11") # 這里是 pybind11 的安裝路徑,一般在虛擬環境的site-packages里面
find_package(pybind11 REQUIRED)
find_package(Eigen3 REQUIRED)
# 如果你使用的是系統安裝的 pybind11,也可以使用:
# find_package(pybind11 REQUIRED MODULE)# 包含頭文件路徑
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${pybind11_INCLUDE_DIRS})
include_directories(${EIGEN3_INCLUDE_DIR})# 添加模塊
pybind11_add_module(demo main.cc)

編寫c++代碼

創建一個名為 main.cc 的源文件,并添加以下內容:

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <vector>
#include <string>
#include <cmath>namespace py = pybind11;// 示例1: 簡單函數
int add(int i, int j) {return i + j;
}// 示例2: 字符串操作函數
std::string greet(const std::string& name) {return "Hello, " + name + "!";
}// 示例3: C++ 類
class Calculator {
public:Calculator(double initial_value = 0.0) : value(initial_value) {}void add(double x) {value += x;}void multiply(double x) {value *= x;}double get_value() const {return value;}void set_value(double v) {value = v;}private:double value;
};// 示例4: 使用 STL 容器
std::vector<double> square_list(const std::vector<double>& input) {std::vector<double> result;result.reserve(input.size());for (const auto& item : input) {result.push_back(item * item);}return result;
}// 示例5: 數學計算函數
double calculate_distance(double x1, double y1, double x2, double y2) {double dx = x2 - x1;double dy = y2 - y1;return std::sqrt(dx * dx + dy * dy);
}// Python 綁定部分
PYBIND11_MODULE(demo, m) {m.doc() = "pybind11 示例模塊"; // 模塊文檔字符串// 綁定簡單函數m.def("add", &add, "兩個整數相加",py::arg("i"), py::arg("j"));m.def("greet", &greet, "問候函數",py::arg("name") = "World");// 綁定數學函數m.def("calculate_distance", &calculate_distance, "計算兩點間距離",py::arg("x1"), py::arg("y1"), py::arg("x2"), py::arg("y2"));// 綁定STL容器函數m.def("square_list", &square_list, "計算列表中每個元素的平方");// 綁定類py::class_<Calculator>(m, "Calculator").def(py::init<double>(), "構造函數", py::arg("initial_value") = 0.0).def("add", &Calculator::add, "加法操作", py::arg("x")).def("multiply", &Calculator::multiply, "乘法操作", py::arg("x")).def("get_value", &Calculator::get_value, "獲取當前值").def("set_value", &Calculator::set_value, "設置當前值", py::arg("v")).def("__repr__", [](const Calculator& c) {return "<Calculator value=" + std::to_string(c.get_value()) + ">";});
}

python調用

使用上面的 CMakeLists.txt 和 main.cc 即可編譯生成 demo.so 文件,接下來只要將這個 demo.so 文件添加到 python 的路徑中,就可以在 python 中調用 C++ 函數了。

import sys
sys.path.append('/home/demo/build')  # 添加 .so 所在路徑
import demo  # 引入 .so,調用 C++ 函數# 測試簡單函數
print("=== 簡單函數測試 ===")
result = demo.add(3, 4)
print(f"3 + 4 = {result}")greeting = demo.greet("Python")
print(greeting)# 測試數學函數
print("\n=== 數學函數測試 ===")
distance = demo.calculate_distance(0, 0, 3, 4)
print(f"點(0,0)到點(3,4)的距離: {distance}")# 測試STL容器
print("\n=== STL容器測試 ===")
numbers = [1.0, 2.0, 3.0, 4.0, 5.0]
squared = demo.square_list(numbers)
print(f"原列表: {numbers}")
print(f"平方后: {squared}")# 測試類
print("\n=== 類測試 ===")
calc = demo.Calculator(10.0)
print(f"初始值: {calc.get_value()}")calc.add(5)
print(f"加5后: {calc.get_value()}")calc.multiply(2)
print(f"乘2后: {calc.get_value()}")calc.set_value(100)
print(f"設置為100后: {calc.get_value()}")print(f"對象表示: {calc}")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917174.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917174.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917174.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【OD機試題解法筆記】貪心歌手

題目描述 一個歌手準備從A城去B城參加演出。 按照合同&#xff0c;他必須在 T 天內趕到歌手途經 N 座城市歌手不能往回走每兩座城市之間需要的天數都可以提前獲知。歌手在每座城市都可以在路邊賣唱賺錢。 經過調研&#xff0c;歌手提前獲知了每座城市賣唱的收入預期&#xff1a…

AI: 告別過時信息, 用RAG和一份PDF 為LLM打造一個隨需更新的“外腦”

嘿&#xff0c;各位技術同學&#xff01;今天&#xff0c;我們來聊一個大家在使用大語言模型&#xff08;LLM&#xff09;時都會遇到的痛點&#xff1a;知識過時。 無論是像我一樣&#xff0c;用 Gemini Pro 學習日新月異的以太坊&#xff0c;還是希望它能精確掌握某個特定工具…

深度學習(魚書)day08--誤差反向傳播(后三節)

深度學習&#xff08;魚書&#xff09;day08–誤差反向傳播&#xff08;后三節&#xff09;一、激活函數層的實現 這里&#xff0c;我們把構成神經網絡的層實現為一個類。先來實現激活函數的ReLU層和Sigmoid層。ReLU層 激活函數ReLU&#xff08;Rectified Linear Unit&#xff…

C# 中生成隨機數的常用方法

1. 使用 Random 類&#xff08;簡單場景&#xff09; 2. 使用 RandomNumberGenerator 類&#xff08;安全場景&#xff09; 3. 生成指定精度的隨機小數 C# 中生成隨機數的常用方法&#xff1a; 隨機數類型實現方式示例代碼特點與適用場景隨機整數&#xff08;無范圍&#xf…

Flink 算子鏈設計和源代碼實現

1、JobGraph &#xff08;JobManager&#xff09; JobGraph 生成時&#xff0c;通過 ChainingStrategy 連接算子&#xff0c;最終在 Task 中生成 ChainedDriver 鏈表。StreamingJobGraphGeneratorcreateJobGraph() 構建jobGrapch 包含 JobVertex setChaining() 構建算子鏈isCha…

對接八大應用渠道

背景最近公司想把游戲包上到各個渠道上&#xff0c;因此需要對接各種渠道&#xff0c;渠道如下&#xff0c;oppo、vivo、華為、小米、應用寶、taptap、榮耀、三星等應用渠道 主要就是對接登錄、支付接口&#xff08;后續不知道會不會有其他的&#xff09;&#x…

學習:入門uniapp Vue3組合式API版本(17)

42.打包發行微信小程序的上線全流程 域名 配置 發行 綁定手機號 上傳 提交后等待&#xff0c;上傳 43.打包H5并發布上線到unicloud的前端頁面托管 完善配置 unicloud 手機號實名信息不一致&#xff1a;請確保手機號的實名信息與開發者姓名、身份證號一致&#xff0c;請前往開…

SOLIDWORKS材料明細表設置,屬于自己的BOM表模板

上一期我們了解了如何在SOLIDWORKS工程圖中添加材料明細表?接下來&#xff0c;我們將進行對SOLIDWORKS材料明細表的設置、查看縮略圖、模板保存的深度講解。01 材料明細表設置菜單欄生成表格后左側菜單欄會顯示關于材料明細表的相關設置信息。我們先了解一下菜單欄設置詳情&am…

全棧:Maven的作用是什么?本地倉庫,私服還有中央倉庫的區別?Maven和pom.xml配置文件的關系是什么?

Maven和pom.xml配置文件的關系是什么&#xff1a; Maven是一個構建工具和依賴管理工具&#xff0c;而pom.xml&#xff08;Project Object Model&#xff09;是Maven的核心配置文件。 SSM 框架的項目不一定是 Maven 項目&#xff0c;但推薦使用 Maven進行管理。 SSM 框架的項目可…

超越 ChatGPT:智能體崛起,開啟全自主 AI 時代

引言 短短三年,生成式 AI 已從對話助手跨越到能自主規劃并完成任務的“智能體(Agentic AI)”時代。這場演進不僅體現在模型規模的提升,更在于系統架構、交互范式與安全治理的全面革新。本文按時間線梳理關鍵階段與核心技術,為您呈現 AI 智能體革命的脈絡與未來趨勢。 1. …

一杯就夠:讓大腦瞬間在線、讓肌肉滿電的 “Kick-out Drink” 全解析

一杯就夠&#xff1a;讓大腦瞬間在線、讓肌肉滿電的 “Kick-out Drink” 全解析“每天清晨&#xff0c;當鬧鐘還在哀嚎&#xff0c;你舉杯一飲&#xff0c;睡意像被扔出擂臺——這&#xff0c;就是 Kick-out Drink 的全部浪漫。”清晨 30 分鐘后&#xff0c;250 mL 常溫水里溶解…

系統開機時自動執行指令

使用 systemd 創建一個服務單元可以讓系統開機時自動執行指令&#xff0c;假設需要執行的指令如下&#xff0c;運行可執行文件&#xff08;/home/demo/可執行文件&#xff09;&#xff0c;并輸入參數&#xff08;–input/home/config/demo.yaml&#xff09;&#xff1a; /home/…

Docker 初學者需要了解的幾個知識點 (七):php.ini

這段配置是 php.ini 文件中針對 PHP 擴展和 Xdebug 調試工具的設置&#xff0c;主要用于讓 PHP 支持數據庫連接和代碼調試&#xff08;尤其在 Docker 環境中&#xff09;&#xff0c;具體解釋如下&#xff1a;[PHP] extensionpdo_mysql extensionmysqli xdebug.modedebug xdebu…

【高階版】R語言空間分析、模擬預測與可視化高級應用

隨著地理信息系統&#xff08;GIS&#xff09;和大尺度研究的發展&#xff0c;空間數據的管理、統計與制圖變得越來越重要。R語言在數據分析、挖掘和可視化中發揮著重要的作用&#xff0c;其中在空間分析方面扮演著重要角色&#xff0c;與空間相關的包的數量也達到130多個。在本…

dolphinscheduler中一個腳本用于從列定義中提取列名列表

dolphinscheduler中&#xff0c;我們從一個mysql表導出數據&#xff0c;上傳到hdfs, 再創建一個臨時表&#xff0c;所以需要用到列名定義和列名列表。 原來定義兩個變量&#xff0c;不僅繁鎖&#xff0c;還容易出現差錯&#xff0c;比如兩者列序不對。 所以考慮只定義列定義變量…

JavaWeb(蒼穹外賣)--學習筆記16(定時任務工具Spring Task,Cron表達式)

前言 本篇文章是學習B站黑馬程序員蒼穹外賣的學習筆記&#x1f4d1;。我的學習路線是Java基礎語法-JavaWeb-做項目&#xff0c;管理端的功能學習完之后&#xff0c;就進入到了用戶端微信小程序的開發&#xff0c;用戶端開發的流程大致為用戶登錄—商品瀏覽&#xff08;其中涉及…

靈敏度,精度,精確度,精密度,精準度,準確度,分辨率,分辨力——概念

文章目錄前提總結前提 我最近在整理一份數據指標要求的時候&#xff0c;總是混淆這幾個概念&#xff1a;靈敏度&#xff0c;精度&#xff0c;精確度&#xff0c;精密度&#xff0c;精準度&#xff0c;準確度&#xff0c;分辨率&#xff0c;分辨力&#xff0c;搜了一些文章&…

python-異常(筆記)

#后續代碼可以正常運行 try:f open("xxx.txt","r",encodingutf-8)except:print("except error")#捕獲指定異常&#xff0c;其他異常報錯程序中止&#xff0c;管不到 try:print(name) except NameError as you_call:print("name error"…

[lvgl_player] 用戶界面(LVGL) | 播放器核心設計

docs&#xff1a;基于LVGL的音樂播放器 本項目是為嵌入式設備設計的音樂播放系統&#xff0c;采用LVGL圖形庫構建用戶界面。 系統支持播放WAV格式音頻文件&#xff0c;具備播放列表管理功能&#xff0c;可實現播放/暫停控制、曲目切換等核心操作。 用戶可通過交互界面實時調…

數據賦能(354)——數據分析——多角度分析原則

概述重要性如下&#xff1a;獲得全面理解&#xff1a;多角度分析原則避免僅從單一角度解讀數據&#xff0c;從不同角度、不同維度對數據進行分析&#xff0c;以獲得更全面的理解。發現潛在規律&#xff1a;通過多角度分析&#xff0c;發現數據中的潛在規律和趨勢&#xff0c;為…