我正在学习如何在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>) -> 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)
<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
我认为这种方法可行的原因是Python的
list
和Rust的Vec
都是动态数组,但显然我在某些方面还存在问题...为什么我的尝试不起作用?我应该怎么做才能修复它?