我正在使用SWIG和numpy.i将一个C库暴露给Python。我尝试包装的函数需要一系列double
数组作为参数:
int wcsp2s(struct wcsprm *wcs, int ncoord, int nelem, const double pixcrd[], double imgcrd[], double phi[], double theta[], double world[], int stat[]);
一些数组实际上是二维的,其范围由ncoord
和nelem
参数给出。正是这些二维数组让我感到困扰,因为numpy.i
似乎只支持形式为int n1
,int n2
,double * arr
或其各种排列方式(而我的C函数不想要那些额外的整数),或者double arr [ANY] [ANY]
。后者看起来很有前途,因为多维C数组只是一块连续的内存块,所以应该与函数期望的兼容。但是当我尝试时:
%apply (double INPLACE_ARRAY2[ANY][ANY]) {(double imgcrd[]),(double world[])};
SWIG(或者更准确地说,运行在 SWIG 输出上的 gcc)报错:
wcs_wrap.c:3770:7: error: expected expression before ‘,’ token
在这里,SWIG针对这些参数生成了无效的C代码。
我想做的事情是否可行?我猜我可以使用%inplace和%rename创建一个包装函数,该函数会接受(不必要的)数组维度,然后调用真实函数。比上面使用就地数组的方法更好的是,如果我可以将这些数组作为输出参数返回(它们的维数很容易根据ncoord
和nelem
计算)。
或者,已经存在快速(即不是astLib中的那个)python接口到libwcs,因此我不必这样做吗?
编辑:我刚刚发现pywcs(它有一个如此明显的名称,以至于我应该在最初的搜索中找到它),它解决了我的根本问题。
编辑2:我猜,一个接受2D numpy数组并传递其扁平视图的包装器将绕过问题,因为1D数组似乎起作用。尽管如此,这最终需要大量文件来进行简单的包装器(.i、_wrap.c、来自swig的.py和另一个.py,以进一步包装SWIG函数以解决维度问题)。