rust 返回用Pyo 3加载的数据的函数-无法返回引用临时值的值

szqfcxe2  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(180)

我正在尝试实现使用Pyo3加载numpy array的方法。

use ndarray::{array, ArrayView, Ix2};
use numpy::PyArray2;
use pyo3::types::IntoPyDict;
use pyo3::{PyResult, Python};

pub fn load_2d_vec<'a>() -> ArrayView<'a, f32, Ix2> {
    //  let res: PyResult<ArrayView<'a, f32, Ix2>> = Python::with_gil::<FnOnce(Python<'a>), ArrayView<'a, f32, Ix2>>(|py| {  // did no helped
    let res: PyResult<ArrayView<'a, f32, Ix2>> = Python::with_gil(|py| {
        let np = py.import("numpy")?;
        let locals = [("np", np)].into_py_dict(py);

        let pyarray: &PyArray2<f32> = py
            .eval(r#"np.load("./test_file")"#, Some(locals), None)?
            .extract()?;

        let f = pyarray.readonly().as_array();
        // let f: ArrayView<'a, f32, Ix2> = pyarray.readonly().as_array(); // with defined type and lifetime

        Ok(f) // TODO - cannot return value referencing temporary value [E0515] returns a value referencing data owned by the current function
    });

    res.unwrap()
}

fn main() {
    let a = load_2d_vec();
    assert_eq!(a, array![[1.0, 2.0], [3.0, 4.0]]);
}

但是编译失败了“无法返回引用临时值的值”。我尝试用_gil方法传递一个生命周期给Python::但是我失败了。有什么想法吗?非常感谢。

z9smfwbn

z9smfwbn1#

我发现了。Python::with_gil实体有自己的'py生命周期。这意味着pyarray只存在于with_gil块中。所以我不能直接返回load_2d_vec中的pyrarray。相反,我必须创建一个新变量,将pyarray中的数据复制到该变量中。

相关问题