Python 将只读字符 ** 作为参数传递给函数

Python passing read-only char ** as argument to a function

我有一个需要 char const ** 参数的 C 库函数,例如:

void set_values(void* object, char const ** values, int dim1, int dim2);

其中 values 是指向空终止字符串值的 dim1*dim2 长度数组。

当我尝试使用 cffi/ctypes 调用此函数时,下面的 Python 代码导致错误:

LP_c_char  = ctypes.POINTER(ctypes.c_char)

dim1 = 2
dim2 = 3
values = ('1.0', '2.0', '1.2', '2.2', '1.5', '2.5')

values_ptr = (LP_c_char * (dim1 * dim2))()
for i, value in enumerate(values):
    values_ptr[i] = ctypes.create_string_buffer(value.encode('utf-8'))

mylib.set_values(object, values_ptr, dim1, dim2)

结果是下面 mylib.set_values(...) 行的错误:

TypeError: initializer for ctype 'char * *' must be a cdata pointer, not LP_c_char_Array_6

遗憾的是 values 不能是 double* 数组,因为库接受变量名和表达式。

我正在关注 this old thread。我正在使用 Python 3.7.2 和 cffi 1.14.0.

有人可以指出我这里做错了什么吗?

你不能那样混合使用 ctypes 和 cffi。他们是两个不同的项目。在这种情况下,您尝试调用 cffi 公开的函数,但传递的参数是 ctypes 对象。尝试构建 cffi 对象,例如ffi.new().

按照接受的答案建议,我发现 an example in the cffi documentation 解决了问题。分享给其他可能有同样问题的人。

dim1 = 2
dim2 = 3
values = ('1.0', '2.0', '1.2', '2.2', '1.5', '2.5')

values_ptr = [ffi.new("char[]", bytes(value, encoding="utf-8")) for value in values]

mylib.set_values(object, ffi.new("char *[]", values_ptr), dim1, dim2)