Python 具有SWIG未知长度数组的NumPy C扩展
我想用SWIG包装一个C函数。 该函数将两个数组(长度相同)作为输入,并返回另外三个数组。 然而,不可能预先预测返回数组的长度,这些数组是在函数中动态分配的。 是否可以用SWIG(使用numpy.i)包装这样的函数?如果可以,如何包装? 简化的函数声明如下所示:Python 具有SWIG未知长度数组的NumPy C扩展,python,c,numpy,swig,Python,C,Numpy,Swig,我想用SWIG包装一个C函数。 该函数将两个数组(长度相同)作为输入,并返回另外三个数组。 然而,不可能预先预测返回数组的长度,这些数组是在函数中动态分配的。 是否可以用SWIG(使用numpy.i)包装这样的函数?如果可以,如何包装? 简化的函数声明如下所示: int func(double **a, double **b, long int *N, double *x, double *y, long int *Nx, long int *Ny); 其中,Nx和Ny是预先知道的,但是N(a
int func(double **a, double **b, long int *N, double *x, double *y, long int *Nx, long int *Ny);
其中,Nx
和Ny
是预先知道的,但是N
(a和b
的长度)是不知道的,并且a
和b
在函数中被分配(使用malloc
)。看来SWIG(或任何其他Python包装生成器)都无法做到这一点。
我最终手工编写了Python包装器,这实际上非常简单,使用PyArray\u SimpleNew
或PyArray\u SimpleNewFromData
创建输出数组。
对于后者,必须格外小心,以免产生内存泄漏。
在玩了一会儿之后,我发现前者与简单的
memcpy结合使用更安全。这完全是一个C问题吗?SWIG使它更容易用<代码> STD::C++中的向量< /代码>,即使你结束了原来的函数。是的,它完全是一个C问题。我已经因为这个问题放弃了SWIG,并手动编写了包装器,效果很好。我可以发布答案,但它不是这个问题的真正答案,因为我不使用SWIG。没有理由因此放弃SWIG。只是不要使用SWIG的类型映射(它们非常复杂)。您可以根据需要编写自己的包装器,返回和接收PyObject*参数。SWIG将识别这些,同时仍然处理简单的案例(如int)。