如何从ctypes数组中获取ctypes类型对象

时间:2012-03-29 18:42:02

标签: python arrays list types ctypes

实际上,我正在尝试将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)至少需要一个元素。

1 个答案:

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