是否可以使用int
属性将Python argtypes
自动转换为ctypes整数指针?
E.G。
import ctypes
cfunc = ctypes.CDLL('somelib.so').somefunc
i = 100
cfunc.argtypes = [ctypes.POINTER(ctypes.c_int)]
cfunc(i)
我希望argtypes
属性可以用于自动转换python整数...但是我遇到了错误
<type 'exceptions.TypeError'>: expected LP_c_int instance instead of int
我认为是因为argtype实际上由两个ctypes
调用组成?
显然,这可行:
cfunc(ctypes.byref(ctypes.c_int(i)))
但是有点冗长,尤其是在有多个争论的情况下!
答案 0 :(得分:3)
不会自动转换为指针类型。
POINTER(c_int)
是指向C整数的指针,表示存储,并且通常表示它是输出参数。如果您调用了somefunc(7)
,那么输出值将流向何处?
显然,这可行:
cfunc(ctypes.byref(ctypes.c_int(i)))
不太明显,如果写入了C int*
,则说明您创建了临时 C int存储值。如果cfunc
写入该存储,则函数返回后将立即释放该存储,并且无法访问该值。因此,您必须创建存储并将其分配给变量,以保持引用足够长的时间来检索该值:
v = ctypes.c_int(100) # Create C int storage for Python int 100.
cfunc(ctypes.byref(v)) # Pass 100 by reference into the function
print(v.value) # Retrieve the returned C int as a Python int.