提问人:Nils Werner 提问时间:10/13/2023 更新时间:10/13/2023 访问量:129
Maturin 项目在功能后面有 Python 绑定
Maturin project with Python bindings behind feature
问:
我正在尝试使用 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.rs
src/lib.rs
#[cfg(feature = "python")]
pub mod python;
但是构建它失败了,并发出警告
警告:在本机库中找不到该符号。Python 将无法导入此模块。如果您使用的是 pyo3,请检查是否用作模块名称
PyInit_my_project
#[pymodule]
my_project
如果我把代码放回去,警告就会消失。src/lib.rs
有没有办法将 PyO3 绑定放入子模块中,然后使用功能有条件地导入?
答:
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
哦,我其实很想知道,但不知道该去哪里看。谢谢!
评论