2017-07-11 14 views
-1

私はswigでラップされたCファイルを持っています。このCファイルには、関数ポインタを引数として持つAPIが含まれています(下記参照)。 Iがポインタ引数の機能をマップすることができPythonのctypesとswigの相互運用性

int binary_op (int a, int b, int (*op)(int,int)) 
{ 
    return (*op)(a,b); 
} 

はexample.cは、マッピング関数はSWIGを使用して、同じファイル内に定義されていることを条件とします。しかし、マッピング関数はCtypesでラップされた別のCファイルで定義されています。 Pythonで

testing.c

int add_int(int a, int b){ 
    return a+b; 
} 

、私はSWIGモジュールを生成し、ctypesのでAPIを呼び出し、インポートマッピング機能を生成し、それがエラーを生じました。

testfile.py

import example # Module generated by swig 

from ctypes import * 
wrap_dll = CDLL('testing.dll') # testing.dll is generated with File_2.c 

# Mapping function 'add_int' to argument in 'binary_op' 
example.binary_op(3,4,wrap_dll.add_int) 

に示すエラーは、引数の型が一致していないです。

TypeError: in method 'binary_op', argument 3 of type 'int (*)(int,int)' 
+0

私たちはエラーがあります。コードはありませんし、疑問がありません。 3つのうちの1つが[mcve]のために、より良くしようとしてください。 – Anthon

+0

ここでコールバック、SWIG、Pythonを検索すると、使用できるものが見つかります。それはそこにあります –

+0

@ JensMunk:私は静かに多く探しましたが、何も関係していないようです。あなたが私を関連するものに導くことができれば、どんな助けも認められるでしょう。ありがとう –

答えて

0

私はpythonで以下のようなctypesの機能を作成しました:戻り値の型と引数の型が関数ポインタ引数に似ている

py_callback_type = CFUNCTYPE(c_void_p, c_int, c_int) 

。今私は上記のctypes関数にマッピング関数 'add'をラップしました。

f = py_callback_type(add) 

そして最後に、私はポインタとして戻り値の型を持つラップ機能をキャストと「.VALUEは」ラップポインタ関数のアドレスを提供します。今私は、ポインタへのマッピングのアドレスを機能をマップするとき

extern int binary_op (int a, int b, int INPUT);

:タイプマップを使用して、私は以下のようにポインタ引数を変更したSWIGインタフェースファイルで次に

f_ptr = cast(f, c_void_p).value 

、関数は整数INPUTとしてbinary_op関数に渡されます。 引数はポインタなので、アドレスの関数がマップされます。

example.binary_op(4,5,f_ptr) ==> 9 //mapped function is 'add(int a, int b)' --> returns a+b