gpt4 book ai didi

python - 将字符串列表从 Python 传递给 Rust

转载 作者:太空狗 更新时间:2023-10-29 17:47:12 25 4
gpt4 key购买 nike

我已经学习 Rust 大约两周了,今天,我进入了它的 FFI。我使用 Python 来玩 Rust,使用 ctypes 和 libc。我传递了整数、字符串,甚至学会了传递整数列表 ( thanks to this wonderful answer )。

然后,我尝试传递一个字符串列表(遵循该答案背后的推理),但我失败了,因为我无法获得线索。在 Python 中,我有类似这样的东西来传递字符串数组。

def testRust():
lib = ctypes.cdll.LoadLibrary(rustLib)
list_to_send = ['blah', 'blah', 'blah', 'blah']
c_array = (ctypes.c_char_p * len(list_to_send))()
lib.get_strings(c_array, len(list_to_send))

在 Rust 中,我认为应该有一些东西(比如 STRING_RECEIVER)来收集传入的字符串,但我找不到。

#![feature(libc)]
extern crate libc;

use std::slice;
use libc::{size_t, STRING_RECEIVER};

#[no_mangle]
pub extern fn get_strings(array: *const STRING_RECEIVER, length: size_t) {
let values = unsafe { slice::from_raw_parts(array, length as usize) };
println!("{:?}", values);
}

有没有其他方法可以实现这一目标?

最佳答案

与数字数组的情况完全没有区别。 C 字符串是以零结尾的字节数组,因此它们在 Rust 中的表示将是 *const c_char , 然后可以转换为 &CStr然后可用于获取 &[u8]然后 &str .

python :

import ctypes

rustLib = "libtest.dylib"

def testRust():
lib = ctypes.cdll.LoadLibrary(rustLib)
list_to_send = ['blah', 'blah', 'blah', 'blah']
c_array = (ctypes.c_char_p * len(list_to_send))(*list_to_send)
lib.get_strings(c_array, len(list_to_send))

if __name__=="__main__":
testRust()

使用rust :

#![feature(libc)]
extern crate libc;

use std::slice;
use std::ffi::CStr;
use std::str;
use libc::{size_t, c_char};

#[no_mangle]
pub extern fn get_strings(array: *const *const c_char, length: size_t) {
let values = unsafe { slice::from_raw_parts(array, length as usize) };
let strs: Vec<&str> = values.iter()
.map(|&p| unsafe { CStr::from_ptr(p) }) // iterator of &CStr
.map(|cs| cs.to_bytes()) // iterator of &[u8]
.map(|bs| str::from_utf8(bs).unwrap()) // iterator of &str
.collect();
println!("{:?}", strs);
}

运行:

% rustc --crate-type=dylib test.rs
% python test.py
["blah", "blah", "blah", "blah"]

同样,您应该小心生命周期并确保 Vec<&str>不会超过 Python 端的原始值。

关于python - 将字符串列表从 Python 传递给 Rust,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31074994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com