2012-03-29 10 views
1

Eigentlich versuche ich Ctypes-Arrays in Python-Listen und zurück zu konvertieren.Wie bekomme ich Ctypes-Objekt von einem Ctypes-Array

Wenn gefunden this thread. Aber es setzt voraus, dass wir den Typ zur Kompilierzeit kennen.

Aber ist es möglich, einen Ctypes-Typ für ein Element abzurufen?

Ich habe eine Python-Liste, die mindestens ein Element enthält. Ich möchte, dass dieser

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

etwas tun, natürlich nicht, weil type() funktioniert nicht über eine ctypes kompatible Klasse zurück. Aber selbst wenn die Liste Objekte enthält, die direkt aus Ctypes erstellt wurden, funktioniert der obige Code nicht, da es sich um eine Objektinstanz des Typs handelt.

Gibt es eine Möglichkeit, diese Aufgabe auszuführen?

[EDIT]

Ok, hier ist der Code, der für mich arbeitet. Ich verwende es Eingang paraters von comtypes Server-Methode zu Python Listen und Rückgabewerte Array Zeiger zu konvertieren:

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 

Wie zuvor erläutert, erfordert p_list(items) mindestens ein Element.

Antwort

2

Ich denke nicht, dass das direkt möglich ist, weil mehrere Ctypes-Typen zu einzelnen Python-Typen zuordnen. Zum Beispiel c_int/c_long/c_ulong/c_ulonglong alle Zuordnung zu Python int. Welchen Typ würdest du wählen? Sie könnten eine Karte Ihrer Vorlieben erstellen:

>>> 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 

Auch die undokumentierte _type_ den Typ eines ctypes Array sagen kann.

>>> arr._type_ 
<class 'ctypes.c_double'> 
+0

Sie haben Recht. Mein Problem war eigentlich, dass ich etwas wie "error = HRESULT(); error = E_FAIL" gemacht habe. Dann wurde der Fehler zu einer Liste hinzugefügt, die ich konvertieren wollte. Das Problem war, dass E_FAIL vom Typ int, nicht HRESULT war. Also beide "Fehler = HRESULT (E_FAIL)" oder "Fehler = HRESULT(); (...) error.value = E_FAIL's Arbeit. – jaw

+0

Hallo, ich habe '>>> result', was mir gibt:' <__ main __. C_wchar_p_Array_2 Objekt bei 0x049CF1C0> 'aber' >>> Ergebnis [0] 'funktioniert nicht für mich. Ich bekomme: 'UnicodeEncodeError: 'Charmap' Codec kann Zeichen in Position 2-7 nicht codieren: Zeichenkarten zu '. Kannst du mir helfen? – Aleksandar

Verwandte Themen