当前位置: 首页 > news >正文

在python 代码中调用rust 源码库操作步骤

  • 原理:

将rust源码编译为一个python lib库 ,在python中调用这个lib库。

步骤:

使用 PyO3 创建 Python 扩展模块

  PyO3 是一个非常流行的库,允许你将 Rust 代码编译为 Python 扩展模块,并在 Python 中直接调用它。

  • 安装maturin
pip install maturin

创建 Rust 项目

  • 在rust 项目中创建lib.rs文件

       在rust 中,lib.rs 默认编译为库,而main.rs默认编译为可执行文件

  • 编辑lib.rs文件
use pyo3::prelude::*;
use pyo3::wrap_pyfunction;#[pyfunction]
fn add_measurement_signal(a2l_info: &mut A2lFileInfo,measurement_info: &MeasurementInfo,
) -> PyResult<()> {a2l_info.add_measurements.push(measurement_info.clone());Ok(())
}#[pyfunction]
fn deleted_measurements_signal(a2l_info: &mut A2lFileInfo,measurement_info: &MeasurementInfo,
) -> PyResult<()> {a2l_info.delete_measurements.push(measurement_info.clone());Ok(())
}#[pyclass]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MeasurementData {#[pyo3(get, set)]pub name: String,#[pyo3(get, set)]pub data_type: String,#[pyo3(get, set)]pub address: u64,#[pyo3(get, set)]pub byte_size: u32,
}#[pymethods]
impl MeasurementData {#[new]fn new(name: String, data_type: String, address: u64, byte_size: u32) -> Self {MeasurementData {name,data_type,address,byte_size,}}// 显式实现 copy 方法来进行深拷贝fn copy(&self) -> MeasurementData {self.clone() // 调用 Clone trait 进行深拷贝}
}#[pyclass]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MeasurementInfo {#[pyo3(get, set)]pub module_name: String,#[pyo3(get, set)]pub group_name: String,#[pyo3(get, set)]pub measurement_data: MeasurementData,
}#[pymethods]
impl MeasurementInfo {#[new]fn new(module_name: String, group_name: String, measurement_data: MeasurementData) -> Self {MeasurementInfo {module_name,group_name,measurement_data,}}// 显式实现 copy 方法来进行深拷贝fn copy(&self) -> MeasurementInfo {self.clone() // 调用 Clone trait 进行深拷贝}
}#[pyclass]
#[derive(Debug, Clone, PartialEq, Eq)]
struct A2lFileInfo {#[pyo3(get, set)]pub file_name: String,#[pyo3(get, set)]pub project_name: String,#[pyo3(get, set)]pub modules: Vec<String>,#[pyo3(get, set)]pub groups: Vec<String>,#[pyo3(get, set)]pub delete_measurements: Vec<MeasurementInfo>,#[pyo3(get, set)]pub add_measurements: Vec<MeasurementInfo>,
}#[pymethods]
impl A2lFileInfo {#[new]fn new(file_name: String,project_name: String,modules: Vec<String>,groups: Vec<String>,read_measurements: Vec<MeasurementInfo>,delete_measurements: Vec<MeasurementInfo>,add_measurements: Vec<MeasurementInfo>,) -> Self {A2lFileInfo {file_name,project_name,modules,groups,read_measurements,delete_measurements,add_measurements,}}// 显式实现 copy 方法来进行深拷贝fn copy(&self) -> A2lFileInfo {self.clone() // 调用 Clone trait 进行深拷贝}
}#[pymodule]
fn a2l_edit_lib(_py: Python, m: &PyModule) -> PyResult<()> {m.add_function(wrap_pyfunction!(add_measurement_signal, m)?)?;m.add_function(wrap_pyfunction!(deleted_measurements_signal, m)?)?;m.add_class::<A2lFileInfo>()?;m.add_class::<MeasurementInfo>()?;m.add_class::<MeasurementData>()?;Ok(())
}

对于内部结构体,需要将成员变量设置pub 并添加修饰符:

#[pyo3(get, set)]
pub name: String,
  • 配置Cargo.toml
[package]
name = "xxxx_lib"
version = "0.1.0"
edition = "2021"[lib]
crate-type = ["cdylib"]  # 编译为动态链接库# 在 [dependencies] 部分添加
[dependencies]pyo3 = { version = "0.21.0", features = ["extension-module"] }[workspace]resolver = "2"[patch.crates-io]
  • 编译rust lib
cargo check
maturin build 

在target/wheels 目录下生成lib 安装文件

  • 安装lib库
pip install --force-reinstall xxx_lib-0.1.0-cp310-cp310-manylinux_2_34_x86_64.whl

在python 源码中调用rust lib

import xxx_lib# 创建 MeasurementData 和 MeasurementInfo
data = a2l_edit_lib.MeasurementData(signal.name, signal.type_name, address, byte_size)
data_info = a2l_edit_lib.MeasurementInfo(module_name, group_name, data.copy())
a2l_edit_lib.add_measurement_signal(self.a2l_parser_info, data_info)
a2l_edit_lib.deleted_measurements_signal(self.a2l_parser_info, data_info)

       可以直接使用对外导出的结构体对象,在测试中发现,可以读取A2lFileInfo 对象,但是没办法修改内部值,只能通过增加rust 接口函数来实现对A2lFileInfo 对象的修改。

http://www.dtcms.com/a/352000.html

相关文章:

  • Excel跨sheet检索提取信息
  • 最简洁yolov8 C++配置教程
  • Leetcode+Java+dpI
  • 汇智焕彩,聚势创新 - openKylin 2.0 SP2正式发布!
  • 企业云办公安全指南:如何构建高效无忧的云办公环境?
  • 在Godot中为您的游戏添加并控制游戏角色的完整技术指南
  • 集成电路学习:什么是MobileNet
  • 在数据同步过程中,RustFS如何平衡RDMA的高吞吐和金融级数据校验的开销?
  • 深分页优化:高效解决方案全解析
  • golang7 数组切片
  • RocketMQ 消息存储机制-消息刷盘
  • TorchInductor - Autotune
  • 【牛客刷题】链表指定区间反转:两种高效解法详解,轻松掌握面试高频题!
  • 互联网医院品牌定位与差异化策略
  • 地下蚁国 全DLC(Empires of the Undergrowth)免安装中文版 在蚂蚁的世界里建立你的帝国
  • 马斯克的「巨硬」: MacroHard
  • 机器学习模型可解释库的介绍:Shapash (一)
  • TRO冻结卷土重来?Keith律所代理Ronald Kuang版权再维权
  • Spring Bean 生命周期高阶用法:从回调到框架级扩展
  • Android系统学习2——Android.Utils.Log模块讨论
  • Android 系统属性添加篇
  • StandardScaler()进行0,1标准化时fit_transform与transform的区别
  • MIME类型与文件上传漏洞 - 网络安全视角
  • 【Jetson】基于llama.cpp部署gpt-oss-20b(推理与GUI交互)
  • 多地闭店上热搜,中产的白月光无印良品怎么了?
  • 项目管理进阶——项目经理任职资格评定聘任及考核管理办法
  • 支持向量机(SVM)核心概念总结
  • Tensor常见操作
  • vscode使用cmake tool进行项目管理安装
  • Elasticsearch映射:优化搜索性能的关键