我正在学习如何在
Python中嵌入Rust函数,如果我的输入是int,而不是列表,一切都可以正常工作.
如果我的lib.rs文件是:
#[no_mangle]
pub extern fn my_func(x: i32, y: i32) -> i32 {
return x + y;
}
我可以使用如下:
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
但是,如果我将lib.rs更改为:
#[no_mangle]
pub extern fn my_func(my_vec: Vec) -> i32 {
let mut my_sum = 0;
for i in my_vec {
my_sum += i;
}
return my_sum;
}
我不能再在Python中使用它(这个编译好的):
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)
in ()
----> 1 lib.my_func([2,3,4])
ArgumentError: argument 1: : Don't know how to convert parameter 1
原因是,尽管这可能起作用,但Python的列表和Rust的Vec都是动态数组,但显然我在这里遗漏了一些东西.
为什么我的尝试不行?我该如何解决?