Следуя этим , я в настоящее время определил функцию Rust 1.0 следующим образом, чтобы быть вызванным из Python с помощью ctypes
:
use std::vec;
extern crate libc;
use libc::{c_int, c_float, size_t};
use std::slice;
#[no_mangle]
pub extern fn convert_vec(input_lon: *const c_float,
lon_size: size_t,
input_lat: *const c_float,
lat_size: size_t) -> Vec<(i32, i32)> {
let input_lon = unsafe {
slice::from_raw_parts(input_lon, lon_size as usize)
};
let input_lat = unsafe {
slice::from_raw_parts(input_lat, lat_size as usize)
};
let combined: Vec<(i32, i32)> = input_lon
.iter()
.zip(input_lat.iter())
.map(|each| convert(*each.0, *each.1))
.collect();
return combined
}
И я настраиваю часть Python так:
from ctypes import *
class Int32_2(Structure):
_fields_ = [("array", c_int32 * 2)]
rust_bng_vec = lib.convert_vec_py
rust_bng_vec.argtypes = [POINTER(c_float), c_size_t,
POINTER(c_float), c_size_t]
rust_bng_vec.restype = POINTER(Int32_2)
Кажется, все в порядке, но я:
- Не уверен, как преобразовать
combined
(aVec<(i32, i32)>
) в C-совместимую структуру, поэтому его можно вернуть на мой Python script. - Не уверен, должен ли я возвращать ссылку (
return &combined
?) и как мне пришлось бы аннотировать функцию с соответствующим спецификатором времени жизни, если бы я сделал