在Linux上实现Rust与Python的互操作可以通过多种方式,以下是一些常见的方法:
1. 使用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
2. 使用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
3. 使用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{ 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是另一个不错的选择,具有较好的性能和易用性。