我正在学习如何在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
都是dynamic arrays,但显然我在这里遗漏了一些东西...
为什么我的try 不起作用?我该怎么做才能修好它?