Python ctypes:类型转换

2024-09-29 00:13:39 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以使用argtypes属性将Python int自动转换为ctypes整数指针?在

例如

import ctypes

cfunc = ctypes.CDLL('somelib.so').somefunc

i = 100
cfunc.argtypes = [ctypes.POINTER(ctypes.c_int)]
cfunc(i)

我希望argtypes属性可以用来自动转换python整数……但是我得到了一个错误

^{pr2}$

我假设这是因为argtype实际上由两个ctypes调用组成?在

显然,这是有效的:

cfunc(ctypes.byref(ctypes.c_int(i)))

但是有点冗长,尤其是有多个辩论!在


Tags: import属性so错误整数ctypesint指针
1条回答
网友
1楼 · 发布于 2024-09-29 00:13:39

没有指针类型的自动转换。在

POINTER(c_int)是指向C整数的指针,表示存储,通常表示它是输出参数。如果您调用了somefunc(7),那么输出值会去哪里?在

Obviously, this works:

cfunc(ctypes.byref(ctypes.c_int(i)))

不是很明显,如果写入了Cint*,那么您已经创建了一个临时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.

相关问题 更多 >