linux

如何在Linux上实现Rust与Python的互操作

小樊
41
2025-08-17 12:08:04
栏目: 编程语言

在Linux上实现Rust与Python的互操作可以通过多种方式,以下是一些常见的方法:

1. 使用pyo3

pyo3是一个Rust库,允许你创建Python模块。它提供了Rust和Python之间的无缝集成。

步骤:

  1. 安装Rust

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    source $HOME/.cargo/env
    
  2. 创建一个新的Rust项目

    cargo new --lib my_rust_module
    cd my_rust_module
    
  3. 添加依赖项: 编辑Cargo.toml文件,添加pyo3依赖:

    [lib]
    name = "my_rust_module"
    crate-type = ["cdylib"]
    
    [dependencies.pyo3]
    version = "0.15.1"
    features = ["extension-module"]
    
  4. 编写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(())
    }
    
  5. 构建Rust项目

    cargo build --release
    
  6. 安装Python模块: 将生成的target/release/libmy_rust_module.so文件复制到Python可以找到的路径,例如/usr/local/lib/python3.8/site-packages/

  7. 在Python中使用Rust模块

    import my_rust_module
    
    result = my_rust_module.add(3, 4)
    print(result)  # 输出 7
    

2. 使用ctypes

ctypes是Python的一个外部函数库,允许你调用动态链接库中的函数。

步骤:

  1. 编写Rust代码并编译为动态链接库: 参考上面的pyo3示例,但将crate-type改为["cdylib"]

  2. 在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扩展模块。

步骤:

  1. 安装Rust: 参考上面的pyo3示例。

  2. 创建一个新的Rust项目

    cargo new --lib my_rust_module
    cd my_rust_module
    
  3. 添加依赖项: 编辑Cargo.toml文件,添加rust-cpython依赖:

    [lib]
    name = "my_rust_module"
    crate-type = ["cdylib"]
    
    [dependencies.rust-cpython]
    version = "0.1.0"
    
  4. 编写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(())
    }
    
  5. 构建Rust项目

    cargo build --release
    
  6. 安装Python模块: 将生成的target/release/libmy_rust_module.so文件复制到Python可以找到的路径。

  7. 在Python中使用Rust模块: 参考上面的pyo3示例。

总结

以上方法各有优缺点,选择哪种方法取决于你的具体需求和偏好。pyo3提供了最直接的Rust和Python互操作方式,而ctypes则更为通用,适用于任何语言编写的动态链接库。rust-cpython是另一个不错的选择,具有较好的性能和易用性。

0
看了该问题的人还看了