问题
我试图在c库中使用一个函数,其原型如下:
int glip_get_backends(const char ***name, size_t *count);
这里的name参数就是问题所在。它是一个通过引用传递的2个酒体字符数组。在C中,该函数的用法如下:
const char** name;
size_t count;
glip_get_backends(&name, &count);
for (size_t i = 0; i < count; i++) {
printf("- %s\n", name[i]);
}现在,我想使用ctype从python中使用这个函数。
我试过的
对我来说,最符合逻辑的方法是在python中这样做:
lglip = CDLL("libglip.so")
count = c_int(0)
backends = POINTER(POINTER(c_char))
lglip.glip_get_backends(byref(backends), byref(count))导致错误消息。
TypeError: byref()参数必须是ctype实例,而不是'_ctypes.PyCPointerType‘
下一种方法是三次使用POINTER()函数并省略byref(),但这会导致以下错误:
ctypes.ArgumentError:参数1::不知道如何转换参数1
然后,我从this question那里得到了灵感,并提出了以下建议:
lglip = CDLL("libglip.so")
count = c_int(0)
backends = POINTER(POINTER(c_char))()
lglip.glip_get_backends(byref(backends), byref(count))
for i in range(0, count.value):
print backends[i] 由于某些原因,在backends定义之后添加backends已经修正了调用,但我得到的输出是:
< ctypes.LP_c_char对象在0x7f4592af8710 > < ctypes.LP_c_char对象在0x7f4592af8710 >
我似乎不能在python中使用一个itterator在二维c数组上进行测试,因为它没有正确地取消引用。
发布于 2015-05-19 12:04:40
在意识到在C实现中,%s习惯于对子字符串进行itterate操作之后,我想出了以下工作解决方案:
lglip = CDLL("libglip.so")
count = c_int(0)
backends_c = POINTER(c_char_p)()
lglip.glip_get_backends(byref(backends_c), byref(count))
backends = []
for i in range(0, count.value):
backends.append(backends_c[i])
print backends更新:将POINTER(POINTER(c_char))()更改为POINTER(c_char_p)(),正如eryksun建议的那样。这样我就可以轻松地访问字符串。
发布于 2015-05-19 12:31:16
如果后端成员可以使用index方法,则可以使用以下代码:
lglip = CDLL("libglip.so")
count = c_int(0)
backends = POINTER(POINTER(c_char))()
lglip.glip_get_backends(byref(backends), byref(count))
for i in range(0, count.value):
print ''.join(backends[i][:backends[i].index("0")])https://stackoverflow.com/questions/30324758
复制相似问题