实际上,我正在尝试将ctypes数组转换为python列表并返回。
如果找到this thread。但它假设我们在编译时知道类型。
但是有可能为元素检索ctypes类型吗?
我有一个包含至少一个元素的python列表。我想做那样的事情
import ctypes
arr = (type(pyarr[0]) * len(pyarr))(*pyarr)
这显然不起作用,因为type()
不返回ctypes兼容类。但即使列表包含直接从ctypes创建的对象,上面的代码也不起作用,因为它是该类型的对象实例。
有没有办法执行此任务?
[编辑]
好的,这是适合我的代码。我正在使用它将输入paraters从comtypes服务器方法转换为python列表并将值返回到数组指针:
def list(count, p_items):
"""Returns a python list for the given times represented by a pointer and the number of items"""
items = []
for i in range(count):
items.append(p_items[i])
return items
def p_list(items):
"""Returns a pointer to a list of items"""
c_items = (type(items[0])*len(items))(*items)
p_items = cast(c_items, POINTER(type(items[0])))
return p_items
如前所述,p_list(items)
至少需要一个元素。
答案 0 :(得分:2)
我不认为这是直接可能的,因为多个ctypes类型映射到单个Python类型。例如c_int / c_long / c_ulong / c_ulonglong都映射到Python int。你会选择哪种类型?您可以创建首选项地图:
>>> D = {int:c_int,float:c_double}
>>> pyarr = [1.2,2.4,3.6]
>>> arr = (D[type(pyarr[0])] * len(pyarr))(*pyarr)
>>> arr
<__main__.c_double_Array_3 object at 0x023540D0>
>>> arr[0]
1.2
>>> arr[1]
2.4
>>> arr[2]
3.6
此外,未记录的_type_
可以告诉ctypes数组的类型。
>>> arr._type_
<class 'ctypes.c_double'>