【发布时间】:2019-01-31 22:36:00
【问题描述】:
我想使用 C++ 中的一些信息,这些信息包含在 Python 中字符列表中的序列化缓冲区中,使用 ctypes。我尝试了以下方法,但我不明白为什么我的参数类型会引发错误。
我有一些 C++ 代码的 C 包装器,格式为
extern "C" {
special_object *special_object_new() { return new special_object(); }
int function(special_object *O, int buffer_size, char *buffer) {
char *buf = (char*) malloc(buffer_size);
for(int i = 0; i < buffer_size; i++) buf[i] = buffer[i];
O->do_something_in_cpp_with_buf(buf);
free(buf);
buf = NULL;
return 0;
}
}
我想从 Python ctypes 传递 function 一个字符缓冲区 buf。这个字符缓冲区最初在 Python 中以字符列表的形式出现,所以我首先使用将其转换为 C 字符数组
import ctypes
import cdll
buf_c = (ctypes.c_char*len(buf))(*buf)
然后使用
将其转换为指针buf_p = ctypes.cast(buf_c, ctypes.POINTER(ctypes.c_char))
有一个类型
>>> <class 'ctypes.LP_c_char'>
我已经知道这个缓冲区的大小,buf_size,是一个整数。
我执行以下操作(加载库和声明函数参数),
lib = cdll.LoadLibrary('PATH_TO_LIB/lib.so')
lib.function.restype = ctypes.c_int
lib.function.argtypes = [ctypes.c_int, ctypes.POINTER(ctypes.c_char)]
然后我创建包含函数的类,
class Special(object):
def __init__(self):
self.obj = lib.special_object_new()
def py_function(self, buffer_size, buffer):
res = lib.function(self.obj, buffer_size, buffer)
最后,我尝试称它为
s = Special()
s.py_function(ctypes.c_int(buf_size), buffer)
但我得到了错误
ArgumentError: argument 1: <type 'exceptions.TypeError'>: wrong type
当我制作指针时,我无法弄清楚我做错了什么?任何帮助将不胜感激!
【问题讨论】:
-
你声明的那些
argtypes没有意义。 -
您能说得更具体些吗?
-
您用两个元素定义了
argtypes。您的函数需要三个参数。 -
是的,我明白你的意思。奇怪的是,这适用于
function(self.obj, double_variable)形式的函数,其中double_variable是ctypes.c_double。因此,我推断argtypes只关心类实例以外的参数......我也不知道为什么会这样。