2012-03-29 25 views
1

実際には、私はctypes配列をPythonリストに変換しようとしています。ctypes配列からctypes型オブジェクトを取得する方法

もし見つかった場合this thread。しかしコンパイル時に型を知っていることを前提としています。

要素のctypes型を取得することは可能ですか?

私は少なくとも1つの要素を含むpythonリストを持っています。私はtype()はctypesの互換性のあるクラスを返さないので、これは明らかに動作しません

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

何かをしたいです。しかし、リストにctypesから直接作成されたオブジェクトが含まれていても、上記のコードはその型のオブジェクトインスタンスであるため機能しません。

このタスクを実行する方法はありますか?

[EDIT]

[OK]を、ここに私のために動作するコードです。私は、Pythonのリストにcomtypesサーバーメソッドから入力paratersを変換し、配列ポインタに値を返すためにそれを使用しています:

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にマップします。どちらのタイプを選択しますか? 、文書化されていない_type_はctypesのアレイのタイプを伝えることができます。また

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

:あなたは、あなたの好みのマップを作成することができます。

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

あなたはそうです。私の問題は実際には、 'error = HRESULT(); error = E_FAIL'のようなことをしたことです。その後、私が変換したいリストにエラーが追加されました。問題は、E_FAILがHRESULTではなくint型であることでした。したがって、 'error = HRESULT(E_FAIL)'または 'error = HRESULT();です。 (...)error.value = E_FAIL'の作業です。 – jaw

+0

こんにちは、私は ''>結果 ''が私に与えます。 '' <__ main __。c_wchar_p_Array_2 object at 0x049CF1C0> 'ですが、' >>> result [0] 'は私のためには機能しません。 UnicodeEncodeError: 'charmap'コーデックは、位置2-7の文字をエンコードできません:文字は 'にマップします。手伝って頂けますか? – Aleksandar

関連する問題