Python ctypes:类型转换

时间:2018-11-12 15:24:12

标签: python ctypes

是否可以使用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)))

但是有点冗长,尤其是在有多个争论的情况下!

1 个答案:

答案 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.