【发布时间】:2016-11-11 06:13:29
【问题描述】:
考虑以下最小示例:我有一个 C++ 函数“myfun”,它接受一个数字和另一个函数作为输入,并返回在 x 处计算的函数:
double myfun(double x, double (*f)(double y))
{ 返回 f(x); }
我将此代码存储在“test.cpp”中。相应头文件'test.hpp'中的代码很简单
double myfun(double x, double (*f)(double y));
现在,我尝试使用 SWIG 从 Python 访问“myfun”。 'swig.i' 文件如下所示:
%module 测试
%{
#include "test.hpp"
%}
双myfun(双x,双(* f)(双y));
每当我尝试在 Python 中调用此函数时,例如与
从测试导入 myfun
myfun(2, lambda y: y**2)
我收到错误:
在方法“myfun”中,类型为“double (*)(double)”的参数 2
所以我的问题很简单:如何修改“swig.i”文件以便我可以将任何(合适的 Python)函数传递给“myfun”? (这个问题与How to wrap a c++ function which takes in a function pointer in python using SWIG'这个帖子有点相关,但不同的是,这里我没有在C++中指定输入函数,而是我想把它作为一个免费的'参数')。
【问题讨论】:
-
如果您只是想要一个 python 解决方案,请考虑使用cython。 SWIG 已经(或曾经)倾向于在版本之间引入不兼容的语法更改。以前的雇主对此有巨大的问题。