如何使用 PyO3 构建混合 Python Rust 包
How to structure a mixed Python Rust package with PyO3
我正在寻找有关如何构建 Python 包的信息,该包包装了用 Rust 编写的扩展模块,其中两种语言混合使用。我将 pyO3 用于 FFI,但似乎找不到有关如何执行此操作的示例。
具体来说:我的 Rust 库公开了一种类型,该类型后来被 python class 包装。
只有 python class 应该为以后的用户公开,并且应该对包进行结构化,以便可以将其推送到 PyPI。
例如:
生锈的一面
#[pyclass]
pub struct Point {
x: f64,
y: f64
}
#[pymethods]
impl Point {
#[new]
pub fn new(x: f64, y: f64) -> Self { Self{x, y} }
}
在python这边
from ??? import Point
class Points:
points: List[Point]
def __init__(self, points: List[Tuple[float, float]]):
self.points = []
for point in points:
x, y = point
self.points.append(Point(x, y))
如果有任何信息、来源、示例等,我将不胜感激!
我找到了使用 Maturin 执行此操作的方法。
因此,如果其他人试图了解如何执行此操作,请使用以下一种方法。
项目需要具有以下结构:
my_project
├── Cargo.toml
├── my_project
│ ├── __init__.py
│ └── sum.py
└── src
└── lib.rs
Cargo.toml 可以是:
[package]
name = "my_project"
version = "0.1.0"
edition = "2018"
[lib]
name = "my_project"
crate-type = ["cdylib"]
[dependencies.pyo3]
version = "0.14.5"
features = ["extension-module"]
lib.rs 的一个例子是:
use pyo3::prelude::*;
#[pyfunction]
fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
Ok((a + b).to_string())
}
#[pymodule]
fn my_project(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
Ok(())
}
现在 sum.py 可以访问该功能(在开发期间使用 maturin develop
后,以及 maturin build
后自动发布时):
from .my_project import sum_as_string
class Sum:
sum: str
def __init__(self, lhs: int, rhs: int):
self.sum = sum_as_string(lhs, rhs)
_ init _.py 文件可以例如仅公开 Sum class:
from .sum import Sum
我正在寻找有关如何构建 Python 包的信息,该包包装了用 Rust 编写的扩展模块,其中两种语言混合使用。我将 pyO3 用于 FFI,但似乎找不到有关如何执行此操作的示例。 具体来说:我的 Rust 库公开了一种类型,该类型后来被 python class 包装。 只有 python class 应该为以后的用户公开,并且应该对包进行结构化,以便可以将其推送到 PyPI。
例如:
生锈的一面
#[pyclass]
pub struct Point {
x: f64,
y: f64
}
#[pymethods]
impl Point {
#[new]
pub fn new(x: f64, y: f64) -> Self { Self{x, y} }
}
在python这边
from ??? import Point
class Points:
points: List[Point]
def __init__(self, points: List[Tuple[float, float]]):
self.points = []
for point in points:
x, y = point
self.points.append(Point(x, y))
如果有任何信息、来源、示例等,我将不胜感激!
我找到了使用 Maturin 执行此操作的方法。 因此,如果其他人试图了解如何执行此操作,请使用以下一种方法。
项目需要具有以下结构:
my_project
├── Cargo.toml
├── my_project
│ ├── __init__.py
│ └── sum.py
└── src
└── lib.rs
Cargo.toml 可以是:
[package]
name = "my_project"
version = "0.1.0"
edition = "2018"
[lib]
name = "my_project"
crate-type = ["cdylib"]
[dependencies.pyo3]
version = "0.14.5"
features = ["extension-module"]
lib.rs 的一个例子是:
use pyo3::prelude::*;
#[pyfunction]
fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
Ok((a + b).to_string())
}
#[pymodule]
fn my_project(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
Ok(())
}
现在 sum.py 可以访问该功能(在开发期间使用 maturin develop
后,以及 maturin build
后自动发布时):
from .my_project import sum_as_string
class Sum:
sum: str
def __init__(self, lhs: int, rhs: int):
self.sum = sum_as_string(lhs, rhs)
_ init _.py 文件可以例如仅公开 Sum class:
from .sum import Sum