Как получить список пользовательских объектов из Rust в Python с помощью Ctypes?

#python #rust #ctypes #ffi

#python #Ржавчина #ctypes #ffi

Вопрос:

Я пытаюсь отправить массив пользовательских объектов из Rust в Python в результате вызова функции:

 pub struct Item {
    name: String,
    description: String,
    tags: Vec<String>
}

pub struct SearchResults {
    count: usize,
    results: Vec<Item>
}

fn get_content(url: amp;str) -> hyper::Result<String> {
    let client = Client::new();
    let mut response = try!(client.get(url).send());
    let mut buf = String::new();
    try!(response.read_to_string(amp;mut buf));
    Ok(buf)
}

#[no_mangle]
pub unsafe extern fn get_search_results(search: amp;str) -> SearchResults {

    let mut url = String::from("http://localhost:8080/search?q=");
    url.push_str(amp;search);

    let content = get_content(amp;url).unwrap();
    let j: Vec<SearchResult> = json::decode(amp;content).unwrap();
    return SearchResults {count: j.len(), results: j};
}
  

И мой код на Python:

 from ctypes import cdll, Structure, c_wchar_p, c_int, POINTER


class SearchResult(Structure):
    _fields_ = [("name", c_wchar_p), ("description", c_wchar_p), ("tags", POINTER(c_wchar_p))]


class SearchResults(Structure):
    _fields_ = [("count", c_int), ("results", POINTER(SearchResult))]

lib = cdll.LoadLibrary("target/release/libplugin_core.dylib")

get_search_results = lib.get_search_results
get_search_results.restype = SearchResults

print(get_search_results("test"))
  

Когда я запускаю код Python, я получаю исключение malloc:

 malloc: *** mach_vm_map(size=140734736883712) failed (error code=3)
  

Вероятно, там отсутствует куча вещей.

Комментарии:

1. amp;str и Result или Vec не являются ffi-безопасными типами.

2. Возможно, вы захотите ознакомиться с сводным каталогом Rust FFI . Хотя в настоящее время я не возвращаю коллекцию элементов, есть много более простых вещей, которые вам нужно сделать до этого момента.

3. Выглядит очень полезно, спасибо!