在C中调用从Python接收函数指针的函数

2024-04-25 06:26:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Swig从C源代码生成python库。 有一个函数在C中接收指向函数的指针。我需要从Python调用它,但回调函数必须在Python中。 我看到的所有文档都使用C中的回调函数

示例:

typedef double (*FeeCalculator)(Transaction* p);

void dealTransaction(Transaction* t, FeeCalculator feeCalculator);

我希望该函数在Python中可用。比如:

def myFeeCalculator(tran):
    return trans.Sum * 0.1

def main():
   t = Transaction()
   dealTransaction(t, myFeeCalculator)

Tags: 函数文档示例源代码defswigtransaction指向
1条回答
网友
1楼 · 发布于 2024-04-25 06:26:31

谢谢柔印。 我就是这么做的:

我终于做到了:

大口:

%{

typedef double (*FeeCalculator)(Transaction* p);
typedef struct{
    FeeCalculator callback;
    void* context;
} FeeCalculatorCallbackAndContext;

void dealTransaction(Transaction* t, FeeCalculatorCallbackAndContext* feeCalculator);

double __WrapperCallback(Transaction * t, void* context){
    PyObject *pTransaction = SWIG_NewPointerObj(SWIG_as_voidptr(t), SWIGTYPE_p_Transaction, 0 );
    PyObject* feeCalc = (PyObject*)context;
    PyObject *result = PyObject_CallFunctionObjArgs(feeCalc, pTransaction, NULL);
    double r = PyFloat_FromDouble(result);
    Py_DECREF(result);
    return r;
}

%typemap(in) FeeCalculatorCallbackAndContext* (FeeCalculatorCallbackAndContext temp) {
  if (!PyCallable_Check($input)) SWIG_fail;
  temp.callback = __WrapperCallback;
  temp.context = $input;
  $1 = &temp;
}

%}

C类:

void dealTransaction(Transaction* t, FeeCalculatorCallbackAndContext* feeCalculator){
    feeCalculator->callback(t, feeCalculator->context);
}

来自Python的调用:

import myLib

def myFeeCalculator(tran):
    return trans.Sum * 0.1

def main():
   t = Transaction()
   myLib.dealTransaction(t, myFeeCalculator)

相关问题 更多 >