Maturin 项目在功能后面有 Python 绑定

Maturin project with Python bindings behind feature

提问人:Nils Werner 提问时间:10/13/2023 更新时间:10/13/2023 访问量:129

问:

我正在尝试使用 maturin 和 PyO3 为 Rust 库编写可选的 Python 绑定。maturin 创建的默认布局是

my-project
├── Cargo.toml
├── python
│   └── my_project
│       ├── __init__.py
│       └── bar.py
├── pyproject.toml
├── README.md
└── src
    └── lib.rs

其中所有 Rust 代码(包括属性)都进入:#[pymodule]src/lib.rs

use pyo3::prelude::*;

/// Formats the sum of two numbers as string.
#[pyfunction]
fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
    Ok((a + b).to_string())
}

/// A Python module implemented in Rust.
#[pymodule]
fn rir_generator(_py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
    Ok(())
}

但是,由于我想将所有这些代码放在条件函数后面,因此我正在尝试将所有这些包装器代码放入其中,然后将其导入到 usingsrc/python.rssrc/lib.rs

#[cfg(feature = "python")]
pub mod python;

但是构建它失败了,并发出警告

警告:在本机库中找不到该符号。Python 将无法导入此模块。如果您使用的是 pyo3,请检查是否用作模块名称PyInit_my_project#[pymodule]my_project

如果我把代码放回去,警告就会消失。src/lib.rs

有没有办法将 PyO3 绑定放入子模块中,然后使用功能有条件地导入?

PYO3型 马图林

评论

1赞 Chayim Friedman 10/13/2023
通常的方法是有两个库,核心库和导入核心库的绑定库。
0赞 Nils Werner 10/13/2023
我也在考虑这个问题,但有点气馁,因为我不知道如何构建这样一个项目......我想在一个共同的工作空间里?
1赞 Chayim Friedman 10/15/2023
是的,一个工作区。

答:

2赞 Abdul Niyas P M 10/13/2023 #1

你快到了。您需要将以下部分添加到 删除警告。Cargo.toml

[features]
default = ["python"]
python = []

引用文档

特征在 Cargo.toml 的表中定义。每 feature 指定其他功能或可选依赖项的数组 它使。[features]

默认情况下,除非显式启用,否则所有功能都将被禁用。这将导致本机库在没有符号的情况下构建,因此发出警告。这 可以通过指定默认功能进行更改PyInit_<module_name>

评论

0赞 Nils Werner 10/13/2023
哦,我其实很想知道,但不知道该去哪里看。谢谢!