#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. Выглядит очень полезно, спасибо!