gpt4 book ai didi

Python 使用 ctypes 传递 char * 数组并填充结果

转载 作者:太空狗 更新时间:2023-10-29 20:42:27 43 4
gpt4 key购买 nike

我正在尝试使用 ctypes 在 python 中创建一个 char * 数组,以将其传递给用于填充字符串的库。我希望返回的 4 个字符串每个长度不超过 7 个字符。

我的代码是这样的

测试库.py

from ctypes import *
primesmile = CDLL("/primesmile/lib.so")

getAllNodeNames = primesmile.getAllNodeNames
getAllNodeNames.argtypes = [POINTER(c_char_p)]
results = (c_char_p * 4)(addressof(create_string_buffer(7)))
err = getAllNodeNames(results)

lib.cpp

void getAllNodeNames(char **array){
DSL_idArray nodes; //this object returns const char * when iterated over
network.GetAllNodeIds(nodes);
for(int i = 0; i < (nodes.NumItems()); i++){
strcpy(array[i],nodes[i]);
}
}

当我尝试运行这段代码时,我总是遇到段错误。我已经从 C 中创建了一个完美运行的测试,但在 Python 中,我必须错误地设置指针数组或其他东西。它似乎到达循环中的第二个节点,然后出现问题,正如我从将数据吐出到命令行中所看到的那样。任何见解将不胜感激。

最佳答案

以下代码有效:

测试.py:

import ctypes
lib = ctypes.CDLL("./libtest.so")
string_buffers = [ctypes.create_string_buffer(8) for i in range(4)]
pointers = (ctypes.c_char_p*4)(*map(ctypes.addressof, string_buffers))
lib.test(pointers)
results = [s.value for s in string_buffers]
print results

test.c(使用 gcc test.c -o libtest.so -shared -fPIC 编译为 libtest.so):

#include <string.h>
void test(char **strings) {
strcpy(strings[0],"this");
strcpy(strings[1],"is");
strcpy(strings[2],"a");
strcpy(strings[3],"test!");
}

正如 Aya 所说,您应该确保终止零有空间。但我认为你的主要问题是字符串缓冲区被垃圾收集或类似的东西,因为不再有直接引用它。或者当没有为它们存储引用时,其他原因在字符串缓冲区的创建过程中造成麻烦。例如,这会导致四次相同的地址而不是不同的地址:

import ctypes
pointers = [ctypes.addressof(ctypes.create_string_buffer(8)) for i in range(4)]
print pointers

关于Python 使用 ctypes 传递 char * 数组并填充结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16699800/

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