我有一个预先导入的模块,我正在使用 python gil 调用一个方法,如下所示。
Python::with_gil(|py| {
let res = module.call_method1(py, "my_method", (arg1, arg2))?;
})
这将返回 rust 对象 PyObject,但返回的是 python list
。我想遍历这个列表以将内部转换成我可以在 Rust 中使用的东西(它是一个 Numpy 数组的 Python 列表,我正在使用 numpy/ndarray 板条箱)。
我对如何迭代这个有点困惑。如果我尝试cast_as
a PyList
,我会收到警告:UnsafeCell<PyObject> cannot be shared between threads safely
. 它似乎extract
也不起作用。
如何迭代这个 PyObject?谢谢。
编辑:根据要求添加更多详细信息
List[numpy.ndarray]
如果您使用的是 python Typing 系统,则python 的返回值是 a 。由于每个 numpy 数组的长度可能不同,我不能将其全部转换为 python 中的 numpy 数组并通过它。示例输出如下:
[array([214.17725372, 192.78236675, 354.27965546, 389.84558392,
0.99999297])]
我在 Rust 中尝试过的内容:
let pylist = res.cast_as::<PyList>(py)?;
编译失败:
UnsafeCell<PyObject> cannot be shared between threads safely
。let pylist = res.extract::<PyList>(py)?;
编译失败:
the trait 'PyClass' is not implemented for 'PyList'
。请注意我use pyo3::prelude::*;
在顶部。let pyany = res.extract::<Vec<PyArray1<f64>>>(py)?;
编译失败:
the trait bound 'Vec<PyArray<f64, Dim<[usize; 1]>>>: pyo3::FromPyObject<'_>' is not satisfied
。这个 PyArray 来自numpy
板条箱。