python ctypes,通过引用

时间:2015-05-19 11:47:10

标签: python c ctypes

问题

我尝试使用以下原型在c库中使用函数:
int glip_get_backends(const char ***name, size_t *count);
这里的name参数是问题所在。它是通过引用传递的2个dimmensional char数组。在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]);
}

现在我想使用ctypes从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()参数必须是ctypes实例,而不是&#39; _ctypes.PyCPointerType&#39;

下一种方法是使用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由于某种原因我无法完全理解已经修复了调用,但我获得的输出是:

  

&LT; ctypes.LP_c_char对象位于0x7f4592af8710&gt;
  &LT; ctypes.LP_c_char对象位于0x7f4592af8710&gt;

我似乎无法在python中使用一个itterator对2维c数组进行迭代,因为它没有正确地取消引用它。

2 个答案:

答案 0 :(得分:4)

在意识到在C实现CREATE TABLE tbl ( col1 TEXT, col2 INTEGER, CHECK ( my_validate_func(row_to_json(tbl.*))) ); 用于迭代子字符串后,我提出了以下工作解决方案:

%s

更新:将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))(),建议为eryksun。这样我就可以轻松访问字符串。

答案 1 :(得分:-1)

如果后端成员可以使用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")]) 方法,则可以使用以下代码:

$array = array(
            'kk6NFKK'=>'name',
            'nnbDDD'=>'claGg',
            'nnbDDD'=>'kaoOPOP',
            'nnbDDD'=>'JWIDE4',
            'nnbDDD'=>'lopO'
         );


print_r(each($array));