#single-file #python-module #pyo3 #generate #cargo

app cargo-single-pyo3

从单个 Rust 文件生成 Python 模块

4 个版本

0.1.3 2023 年 2 月 21 日
0.1.2 2022 年 7 月 6 日
0.1.1 2021 年 10 月 7 日
0.1.0 2021 年 5 月 3 日

#319Cargo 插件

每月 27 次下载

MIT 许可证

8KB
167

cargo-single-pyo3 crates.io

通过 pyo3 从单个 Rust 文件构建 Python 模块的实用工具。受 cargo-single 启发。

安装

cargo install cargo-single-pyo3

示例

首先,创建一个包含 pyo3 模块的单个 Rust 文件。在文件顶部添加任何依赖项作为双斜杠注释。例如,如果您创建 foo.rs 并包含以下内容:

// rand = "*"

use pyo3::prelude::*;
use pyo3::wrap_pyfunction;

#[pyfunction]
fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
  // using rand to demonstrate library support
  let c = rand::thread_rng().gen_range(0 ..= 1);
  Ok((a + b + c).to_string())
}

#[pymodule]
fn foo(py: Python, m: &PyModule) -> PyResult<()> {
  m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
  Ok(())
}

然后运行

cargo single-pyo3 foo.rs

这将生成一个 foo.so 文件,然后您可以导入它

$ python3
>>> import foo
>>> foo.sum_as_string(1, 2)
'3'
>>> foo.sum_as_string(2, 2)
'5'

使用说明

模块名称: 文件名是模块的名称,例如 foo.rs 生成 foo.so#[pymodule] 函数的名称必须相同。

构建过程: 工具在您的临时目录中创建与模块名称关联的 Cargo 项目,例如 /tmp/foo。这可能会引起同一台机器上的用户或项目之间的冲突问题,所以请小心(或者如果您有不同的偏好,请提交 PR)。

Pyo3 版本: pyo3 的 Cargo 依赖项会自动生成。如果您需要更改版本,请使用 --pyo3 标志,例如 --pyo3 0.13。您还可以使用 --pyo3 github 来使用主分支上的最新版本。截至 2021 年 5 月 7 日,github 选项对于在 OS X 上构建是必要的。

依赖项

~1.2–2MB
~34K SLoC