gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:59:13 25 4
gpt4 key购买 nike

我正在使用 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)

最佳答案

感谢柔印。这就是我所做的:

这是我最后做的:

痛饮:

%{

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)

关于python - 在 C 中调用从 Python 接收函数指针的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51481038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com