在Linux上实现Rust与Python的互操作可以通过多种方式,以下是一些常见的方法:
pyo3
库pyo3
是一个Rust库,允许你创建Python模块。它提供了Rust和Python之间的无缝集成。
安装Rust:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
创建一个新的Rust项目:
cargo new --lib my_rust_module
cd my_rust_module
添加依赖项:
编辑Cargo.toml
文件,添加pyo3
依赖:
[lib]
name = "my_rust_module"
crate-type = ["cdylib"]
[dependencies.pyo3]
version = "0.15.1"
features = ["extension-module"]
编写Rust代码:
编辑src/lib.rs
文件,添加Python模块代码:
use pyo3::prelude::*;
use pyo3::wrap_pyfunction;
#[pyfunction]
fn add(a: i32, b: i32) -> PyResult<i32> {
Ok(a + b)
}
#[pymodule]
fn my_rust_module(py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(add, m)?)?;
Ok(())
}
构建Rust项目:
cargo build --release
安装Python模块:
将生成的target/release/libmy_rust_module.so
文件复制到Python可以找到的路径,例如/usr/local/lib/python3.8/site-packages/
。
在Python中使用Rust模块:
import my_rust_module
result = my_rust_module.add(3, 4)
print(result) # 输出 7
ctypes
库ctypes
是Python的一个外部函数库,允许你调用动态链接库中的函数。
编写Rust代码并编译为动态链接库:
参考上面的pyo3
示例,但将crate-type
改为["cdylib"]
。
在Python中使用ctypes
调用Rust函数:
import ctypes
# 加载动态链接库
lib = ctypes.CDLL('./target/release/libmy_rust_module.so')
# 定义函数原型
lib.add.argtypes = (ctypes.c_int, ctypes.c_int)
lib.add.restype = ctypes.c_int
# 调用函数
result = lib.add(3, 4)
print(result) # 输出 7
rust-cpython
rust-cpython
是另一个Rust库,用于创建Python扩展模块。
安装Rust:
参考上面的pyo3
示例。
创建一个新的Rust项目:
cargo new --lib my_rust_module
cd my_rust_module
添加依赖项:
编辑Cargo.toml
文件,添加rust-cpython
依赖:
[lib]
name = "my_rust_module"
crate-type = ["cdylib"]
[dependencies.rust-cpython]
version = "0.1.0"
编写Rust代码:
编辑src/lib.rs
文件,添加Python模块代码:
extern crate rust_cpython;
use rust_cpython::{Python, ToPyObject};
#[pyfunction]
fn add(a: i32, b: i32) -> PyResult<PyObject> {
Ok((a + b).to_py(py))
}
#[pymodule]
fn my_rust_module(py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(add, m)?)?;
Ok(())
}
构建Rust项目:
cargo build --release
安装Python模块:
将生成的target/release/libmy_rust_module.so
文件复制到Python可以找到的路径。
在Python中使用Rust模块:
参考上面的pyo3
示例。
以上方法各有优缺点,选择哪种方法取决于你的具体需求和偏好。pyo3
提供了最直接的Rust和Python互操作方式,而ctypes
则更为通用,适用于任何语言编写的动态链接库。rust-cpython
是另一个不错的选择,具有较好的性能和易用性。