在 python 中构建和安装之前,如何测试 pyo3 包装在 rust 中的 rust 函数?

问题描述 投票:0回答:1

我有用 Rust 编写的功能,我通过 pyo3 将其暴露给 python。我想测试 python 函数是否正确公开并正确处理 python 类型。

我已经进行了测试来验证实际的功能实现(在 Rust 中)和端到端集成(在 Python 中)。

如何在 rust 中测试 pyo3 python 函数?

python unit-testing rust pyo3
1个回答
0
投票

这在 pyo3 文档中的 3.4 执行现有 Python 代码 - 想要使用其他模块在 Rust 中嵌入 Python? 和前面的章节中介绍了这一点,尽管文档不包含完整的示例。

在包含

lib.rs
#[pymodule]
#[pyfunction]
中,您可以添加:

#[cfg(test)]
mod tests {
    use pyo3::exceptions::PyTypeError;

    use super::*;

    #[test]
    fn test_fizzbuzz() {
        pyo3::append_to_inittab!(py_fizzbuzzo3);
        pyo3::prepare_freethreaded_python();
        Python::with_gil(|py| {
            let fizzbuzzo3 = py
                .import_bound("fizzbuzzo3")
                .expect("Failed to import fizzbuzzo3");
            let fizzbuzz = fizzbuzzo3
                .getattr("fizzbuzz")
                .expect("Failed to get fizzbuzz function");
            let result: PyResult<String> = match fizzbuzz.call1((1i32,)) {
                Ok(r) => r.extract(),
                Err(e) => Err(e),
            };
            let result = result.unwrap();
            let expected_result = "1";
            assert_eq!(result, expected_result);
        });
    }
}
  • pyo3::append_to_inittab!(py_fizzbuzzo3);
    使同一文件中的 python 模块可用,并且必须在初始化 python 解释器之前调用
  • let fizzbuzzo3 = py.import_bound("fizzbuzzo3").expect("Failed to import fizzbuzzo3");
    然后导入模块
  • let fizzbuzz = fizzbuzzo3.getattr("fizzbuzz").expect("Failed to get fizzbuzz function");
    将 python 函数分配给一个变量,以便:
  • 然后可以使用
  • fizzbuzz.call1((1i32,))
    来调用该函数
© www.soinside.com 2019 - 2024. All rights reserved.