Как получить объект типа ctypes из массива ctypes - PullRequest
1 голос
/ 29 марта 2012

На самом деле, я пытаюсь преобразовать массивы ctypes в списки Python и обратно.

Если найдено , эта тема . Но предполагается, что мы знаем тип во время компиляции.

Но возможно ли получить тип ctypes для элемента?

У меня есть список python, который содержит хотя бы один элемент. Я хочу сделать что-то подобное

import ctypes
arr = (type(pyarr[0]) * len(pyarr))(*pyarr)

Это, очевидно, не работает, потому что type() не возвращает совместимый с ctypes класс. Но даже если список содержит объект, созданный непосредственно из ctypes, приведенный выше код не работает, потому что это экземпляр типа объекта.

Есть ли способ выполнить эту задачу?

[EDIT]

Хорошо, вот код, который работает для меня. Я использую его для преобразования входных параметров из метода сервера 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 Ответ

2 голосов
/ 30 марта 2012

Я не думаю, что это напрямую возможно, потому что несколько типов 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'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...