栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从Rust函数返回字符串到Python

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从Rust函数返回字符串到Python

最直接的版本是这样的:

use libc::c_char;use std::ffi::CString;use std::mem;#[no_mangle]pub extern fn query() -> *mut c_char {    let s = CString::new("Hello!").unwrap();    s.into_raw()}

在这里,我们返回一个指向

char
s的零终止序列的指针,该序列可以传递给Python的
c_char_p
。您不能仅仅
CString
因为它是Rust结构而不应该直接在C代码中使用而返回-
它包装
Vec<u8>
并实际上由三个指针大小的整数组成。它与C
char*
直接不兼容。我们需要从中获取原始指针。
CString::into_raw()
方法做到这一点-
它使用
CString
by值,“忘记”它,这样它的分配不会被破坏,并返回一个
*mut c_char
指向数组开头的指针。

但是,这种方式会泄漏字符串,因为我们忘记了它在Rust端的分配,并且永远也不会释放它。我对Python的FFI不够了解,但是解决此问题的最直接方法是创建两个函数,一个用于生成数据,另一个用于释放数据。然后,您需要通过调用以下释放函数来从Python端释放数据:

// above function#[no_mangle]pub extern fn query() -> *mut c_char { ... }#[no_mangle]pub extern fn free_query(c: *mut c_char) {    // convert the pointer back to `CString`    // it will be automatically dropped immediately    unsafe { CString::from_raw(c); }}

CString::from_raw()
方法接受一个
*mutc_char
指针并从中创建一个
CString
实例,以计算该过程中基础的零终止字符串的长度。此操作意味着所有权转移,因此结果
CString
值将拥有分配,并且在删除分配值后将释放分配。这正是我们想要的。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/646860.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号