2012-03-29 2 views
1

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

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

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

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

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

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

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

[EDIT]

Ok, вот код, который работает для меня. Я использую его для преобразования входных paraters из метода comtypes сервера к спискам питона и возвращаемые значения указателей массива:

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) требует, по меньшей мере, один элемент.

ответ

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'> 
+0

Вы правы. Моя проблема на самом деле заключалась в том, что я сделал что-то вроде 'error = HRESULT(); error = E_FAIL'. Затем в список, который я хотел преобразовать, была добавлена ​​ошибка. Проблема заключалась в том, что E_FAIL был типа int, а не HRESULT. Таким образом, оба 'error = HRESULT (E_FAIL)' или 'error = HRESULT(); (...) error.value = E_FAIL'. – jaw

+0

Привет, у меня есть '>>> result' whitch дает мне:' <__ main __. C_wchar_p_Array_2 объект в 0x049CF1C0> 'but' >>> result [0] 'не работает для меня. Я получаю: 'UnicodeEncodeError: кодек 'charmap' не может кодировать символы в позиции 2-7: символьные карты до '. Вы можете мне помочь? – Aleksandar

Смежные вопросы