我有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。
請告知
好吧,我應該是精確的。其實void my_cfunc(int arg)應該是這樣的:「void my_cfunc(int n1,...)」.... 所以,我有兩個解決方案:(1)我在做什麼(2)我沒有想法如何在Python中包裝va_arg函數。這就是爲什麼我要求返回它的函數指針,然後再次調用它的w/ctypes –
@Elias Bachaalany:在答案的最後看到我的更新。 – aknuds1
不,用ctypes你可以很容易地包裝一個va_arg函數:) - 只需將它的地址給ctypes(就像我的示例所示)。 (1,2,3,4,5,6)... - 甚至更好,你可以把它叫做:cfunc(* args) 這就是爲什麼我想要獲取C函數指針並將其提供給Python,然後將其提供給ctypes,然後我可以調用va_arg函數。 –