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)
我有一个需要 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)