2009-08-25 23 views
4

現在、私はpythonコードのパフォーマンスボトルネックをcに移動して、結果の効果を調べています。このコードはシミュレーションを実行し、結果をctypes経由でPythonに報告します。しかし、タイプが正しく一致するようにするのに問題があります。ctypesを使用して整数配列を置換します

私はこの特定の問題を解決しようとしていますが、ドキュメンテーションと手順が少し薄いように見えるため、ctypesの使用に関するより一般的なアドバイスを探しています。

I次のCの関数があります。

extern "C" { 
    void f(int* array, int arraylen) { 
     for(int i = 0; i < arraylen; i++) { 
      array[i] = g() // mutate the value array[i]; 
     } 
    } 
} 

とPythonに次のコードを:

Traceback (most recent call last): 
    File "particle.py", line 9, in <module> 
    _f(buffer, seqlen) 
ctypes.ArgumentError: argument 1: <type 'exceptions.TypeError'>: expected LP_c_int instance instead of _ctypes.ArrayType 

答えて

4

ルックス:

import ctypes 

plib = ctypes.cdll.LoadLibrary('./mylib.so') 
_f = plib.f 
_f.restype = None 
_f.argtypes = [ ctypes.POINTER(ctypes.c_int), ctypes.c_int ] 
seqlen = 50 
buffer = ctypes.c_int * seqlen 
_f(buffer, seqlen) 

しかし、このスニペットは、次のトレースバックで死にますあなたの好きなようにthe cast function

キャスト関数を使用して、ctypesインスタンスを別のctypesデータ型へのポインタにキャストできます。キャストには2つのパラメータ、何らかの種類のポインタに変換できるctypesオブジェクト、およびctypesポインタ型があります。これは、最初の引数と同じメモリブロックを参照する第二引数のインスタンスを返します。私は、問題が何であったかを把握するためのマーク、あなたのスニペットは十分だった

>>> a = (c_byte * 4)() 
>>> a 
<__main__.c_byte_Array_4 object at 0xb7da2df4> 
>>> cast(a, POINTER(c_int)) 
<ctypes.LP_c_long object at ...> 
>>> 
+0

おかげで、私は省略のです私の配列のインスタンス化の括弧は型の不一致を引き起こしました。 –

関連する問題