18 个版本

0.7.2 2024年7月2日
0.7.1 2022年10月25日
0.7.0 2021年10月9日
0.6.0 2021年4月15日
0.0.3 2015年7月8日

#229 in FFI

Download history 2823/week @ 2024-05-01 3270/week @ 2024-05-08 2955/week @ 2024-05-15 2256/week @ 2024-05-22 3200/week @ 2024-05-29 3155/week @ 2024-06-05 3077/week @ 2024-06-12 2583/week @ 2024-06-19 3260/week @ 2024-06-26 2197/week @ 2024-07-03 3192/week @ 2024-07-10 3955/week @ 2024-07-17 3671/week @ 2024-07-24 4101/week @ 2024-07-31 3761/week @ 2024-08-07 3977/week @ 2024-08-14

16,330 每月下载量
用于 34 个 Crates (30 个直接使用)

MIT 许可证

1MB
21K SLoC

rust-cpython 构建状态

警告:此软件包不再积极维护。请改用 PyO3

Rust 为 Python 解释器提供的绑定。


版权所有 (c) 2015-2021 Daniel Grunwald。Rust-cpython 根据 MIT 许可证 许可。Python 根据 Python 许可证 许可。

支持的 Python 版本

  • Python 2.7
  • Python 3.7 至 3.12

警告:此软件包不再积极维护。请改用 PyO3

需要 Rust 1.41.1 或更高版本。

使用方法

要使用 cpython,请将以下内容添加到您的 Cargo.toml

[dependencies]
cpython = "0.7"

示例程序,显示 sys.version 的值

use cpython::{Python, PyDict, PyResult};

fn main() {
    let gil = Python::acquire_gil();
    hello(gil.python()).unwrap();
}

fn hello(py: Python) -> PyResult<()> {
    let sys = py.import("sys")?;
    let version: String = sys.get(py, "version")?.extract(py)?;

    let locals = PyDict::new(py);
    locals.set_item(py, "os", py.import("os")?)?;
    let user: String = py.eval("os.getenv('USER') or os.getenv('USERNAME')", None, Some(&locals))?.extract(py)?;

    println!("Hello {}, I'm Python {}", user, version);
    Ok(())
}

具有 Python 绑定的示例库

以下两个文件将使用 cargo build 构建,并将生成一个兼容 Python 的库。在 Mac OS 上,您需要将输出从 *.dylib 重命名为 *.so。在 Windows 上,您需要将输出从 *.dll 重命名为 *.pyd。

注意

在构建时,python3-sys/build.rs 将在以下位置查找解释器:

  • PYTHON_SYS_EXECUTABLE
  • python
  • python3

选择第一个可用的、与配置的预期版本兼容的(默认情况下,任何Python 3.X解释器都适用)。如果需要特定的解释器,应将环境变量PYTHON_SYS_EXECUTABLE指向它。

Cargo.toml:

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

[dependencies.cpython]
version = "0.7"
features = ["extension-module"]

src/lib.rs

use cpython::{PyResult, Python, py_module_initializer, py_fn};

// add bindings to the generated python module
// N.B: names: "rust2py" must be the name of the `.so` or `.pyd` file
py_module_initializer!(rust2py, |py, m| {
    m.add(py, "__doc__", "This module is implemented in Rust.")?;
    m.add(py, "sum_as_string", py_fn!(py, sum_as_string_py(a: i64, b:i64)))?;
    Ok(())
});

// logic implemented as a normal rust function
fn sum_as_string(a:i64, b:i64) -> String {
    format!("{}", a + b).to_string()
}

// rust-cpython aware function. All of our python interface could be
// declared in a separate module.
// Note that the py_fn!() macro automatically converts the arguments from
// Python objects to Rust values; and the Rust return value back into a Python object.
fn sum_as_string_py(_: Python, a:i64, b:i64) -> PyResult<String> {
    let out = sum_as_string(a, b);
    Ok(out)
}

在Windows和Linux上,您可以使用cargo build --release正常构建。在Mac OS上,需要设置额外的链接器参数。最简单的解决方案是创建一个包含以下内容的.cargo/config文件

[target.x86_64-apple-darwin]
rustflags = [
  "-C", "link-arg=-undefined",
  "-C", "link-arg=dynamic_lookup",
]

有关setup.py集成,请参阅https://github.com/PyO3/setuptools-rust

开发

要构建软件包,运行:make build

要测试软件包,运行:make test

注意:此软件包包含多个使用脚本自动生成的文件。使用Makefile可以确保这些文件在需要时重新生成。

依赖项

~95–680KB
~13K SLoC