当前位置:首页 > 技术 > 正文内容

跨语言编程:Python与Rust的互操作实现

访客 技术 2026年6月14日 1

Python与其他编程语言的交互方法

  • 通过FFI(外部函数接口)实现调用,在Java中称为JNI,将Rust/Go/C/C++编译为C兼容的动态库,然后利用Python的ctypes模块进行加载和调用
  • 采用进程间通信机制(如基于socket的通信)
  • 通过网络协议进行交互,例如RPC框架、HTTP RESTful API等
  • 借助虚拟机/解释器/中间层进行桥接,如Jython实现Python调用Java,PyExecJS执行JavaScript代码
  • 利用WebAssembly(WASM)作为中间层进行语言间通信

构建Rust动态链接库

将Rust代码编译为C兼容的动态链接库,供Python通过ctypes模块加载并调用函数

  1. 使用cargo创建新的Rust库项目
cargo new mathlib --lib

  1. 打开mathlib项目,修改Cargo.toml文件,添加库配置选项 Cargo.toml
...

[lib]  
name = "mathlib"
crate-type = ["cdylib"]

  1. 在src/lib.rs中实现导出函数 src/lib.rs
use std::ffi::{CStr, CString};
use std::os::raw::c_char;

#[no_mangle]  
pub extern "C" fn calculate_sum(a: i32, b: i32) -> i32 {  
    a + b  
}


#[no_mangle]  
pub extern "C" fn compute_sum_float(x: f32, y: f32) -> f32 {  
    x + y  
}


#[no_mangle]  
pub extern "C" fn concat_strings<'a>(first: *const c_char, second: *const c_char) -> *mut c_char {  
    let first_str = unsafe {CStr::from_ptr(first)};
    let first_text = first_str.to_str().expect("Invalid UTF-8 string");
    let second_str = unsafe {CStr::from_ptr(second)};
    let second_text = second_str.to_str().expect("Invalid UTF-8 string");
    let combined = String::from(first_text) + &String::from(second_text);
    let result = CString::new(combined).expect("Failed to create CString").into_raw();
    result
}

关键说明:

  • #[no_mangle] 属性告诉Rust编译器不要改变函数的原始名称
  • pub extern "C" 声明将函数以C语言风格导出,供外部调用
  • 字符串处理流程:*c_char CStr &str String CString *c_char
  1. 编译为动态链接库 在项目根目录执行构建命令
cargo build --release

编译完成后,在target/release目录下会生成对应操作系统的动态链接库:libmathlib.so( Linux)、libmathlib.dylib( macOS)或mathlib.dll( Windows)

  1. Python调用动态链接库示例 invoke_rust.py
import ctypes
import sys

# 加载动态链接库
try:
    lib = ctypes.CDLL("./target/release/libmathlib.so")
except OSError as e:
    print(f"无法加载动态链接库: {e}")
    sys.exit(1)

# 调用整数加法函数
result_int = lib.calculate_sum(10, 25)
print(f"整数加法结果: {result_int}")

# 配置浮点数函数参数和返回类型
lib.compute_sum_float.argtypes = [ctypes.c_float, ctypes.c_float]
lib.compute_sum_float.restype = ctypes.c_float
result_float = lib.compute_sum_float(3.14, 2.86)
print(f"浮点数加法结果: {result_float}")

# 字符串拼接函数配置
lib.concat_strings.argtypes = [ctypes.c_char_p, ctypes.c_char_p]
lib.concat_strings.restype = ctypes.c_char_p

# 调用字符串拼接函数
result_str = lib.concat_strings(b"你好", b", 世界!")
print(f"字符串拼接结果: {result_str.decode('utf-8')}")

# 释放字符串内存
ctypes.c_void_p(lib.concat_strings.restype).in_dll(lib, "concat_strings")(result_str)

执行结果示例:

整数加法结果: 35
浮点数加法结果: 6.0
字符串拼接结果: 你好, 世界!

相关资源

  • Python与Rust互操作技术详解
  • PyO3项目官方文档
  • Rust FFI手册
标签: Pythonrust

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。