私はCPythonの機能を持っている:関数ポインタをCPythonからPythonに戻すには、ctypesを使ってC関数を呼び出しますか?
void my_cfunc(int arg)
{
printf("Hello from C; arg=%d\n", arg);
}
PyObject *get_fptr(PyObject * /*self*/, PyObject * /*args*/)
{
return PyCObject_FromVoidPtr(my_cfunc, NULL);
}
はその後、Pythonで私が持っている:そして、
import mymodule
ptr = mymodule.get_fptr() # will return a PyCObject wrapping the C function pointer
以降:今
from ctypes import *
SOMEFUNC_T = CFUNCTYPE(c_void, c_int)
somefunc = SOMEFUNC_T(ptr) # <-- bad!
、私のように返すようにget_fptr変更した場合:PyLong_FromSize_t (size_t(my_cfunc)) 'somefunc'が有効になります。
しかし私はsize_tに関数ポインタをキャストしたくありません。論理的なことがあろうが、あなたが、唯一(ctypesの経由)のPythonから呼び出すPythonの拡張からCの関数ポインタを返すようにしたいと思いますなぜ
すべての
私は正確だったはずです。実際にはvoid my_cfunc(int arg)は次のようなものでなければなりません: "void my_cfunc(int n1、...)" .... 2つの解決策があります:(1)私がやっていること(2) Pythonでva_arg関数をラップする方法これは私がその関数ポインタを返し、後でそれを再びw/ctypeで呼び出す理由です。 –
@Elias Bachaalany:答えの最後に私の更新を見てください。 – aknuds1
いいえ、ctypesで簡単にva_arg関数をラップできます:) - 私の例のように、そのアドレスをctypesに取得するだけです。 - cfunc(1、2、3、4、5、6)を無制限に呼び出してください... - これはもっとうまくいきます:cfunc(* args) これは私がCの関数ポインタを取得してPythonに渡し、それをctypesに渡してから、va_arg関数を呼び出すことができます。 –