Uczę się, jak osadzać funkcje Rdzy w Pythonie, a wszystko działa dobrze, jeśli moje dane wejściowe są int
s, ale nie na liście.Przekaż listę Pythona do wbudowanej funkcji rdzy
Jeśli mój plik lib.rs
jest:
#[no_mangle]
pub extern fn my_func(x: i32, y: i32) -> i32 {
return x + y;
}
mogę korzystać z tego, co następuje:
In [1]: from ctypes import cdll
In [2]: lib = cdll.LoadLibrary("/home/user/RustStuff/embed/target/release/libembed.so")
In [3]: lib.my_func(5,6)
Out[3]: 11
Jednak jeśli zmienię lib.rs
do:
#[no_mangle]
pub extern fn my_func(my_vec: Vec<i32>) -> i32 {
let mut my_sum = 0;
for i in my_vec {
my_sum += i;
}
return my_sum;
}
już nie mogę użyj go w Pythonie (ten skompilowany dobrze):
In [1]: from ctypes import cdll
In [2]: lib = cdll.LoadLibrary("/home/user/RustStuff/embed/target/release/libembed.so")
In [3]: lib.my_func([2,3,4])
---------------------------------------------------------------------------
ArgumentError Traceback (most recent call last)
<ipython-input-3-454ffc5ba9dd> in <module>()
----> 1 lib.my_func([2,3,4])
ArgumentError: argument 1: <type 'exceptions.TypeError'>: Don't know how to convert parameter 1
Powodem I choć może to działa jest to, że Pythona list
i Rust Vec
są oba dynamiczne tablice, ale widocznie jestem czegoś brakuje tutaj ...
Dlaczego moja próba nie działa? Co powinienem zrobić, żeby to naprawić?