我想访问一个C函数,该函数返回一个包含双数组(其中这些数组的长度由结构体的其他int成员给出的长度)的结构从
python.声明是
typedef struct {
int dim;
int vertices;
int quadrature_degree;
int polynomial_degree;
int ngi;
int quadrature_familiy;
double *weight; /* 1D: ngi */
double *l; /* 2D: ngi * dim */
double *n; /* 2D: ngi * vertices */
double *dn; /* 3D: ngi * vertices * dim */
} element;
extern void get_element(int dim, int vertices, int quad_degree, int poly_degree, element* e);
重要的一点是我希望能够访问所有double *成员作为正确形状的NumPy数组(即dn应该是一个3D数组可访问的).
简单的SWIG包装给我的结构很好,但是所有的double *成员都是在0x348c8a0>上的“double *”类型的< Swig对象.这使得它们无用.我使用NumPy SWIG界面文件播放,但是无法获得像DATA_TYPE * INPLACE_ARRAY1,int DIM1这样的任何类型的代码(我认为在这种情况下不可能让它们匹配,但我很乐意被证明是错误的). 我的猜测是将这些成员的NumPy数组初始化为PyArrayObject,SWIG扩展我的结构以使其在Python中可访问.看起来好像很多工作.任何人都可以使用SWIG看到更好的方式吗?如果使事情更容易,那么可以改变结构或返回它的方法. 或者,我看了一下cython和ctypes.这些能否更好地适应我要实现的目标?我没有使用cython,所以不能判断它的包装能力.对于ctypes,我可以大概想象如何做到这一点,但这意味着手工编写我所希望的一个合理的自动化包装可以为我做的事情. 任何建议感激不尽!