我正在尝试使用swig从python使用以下原型访问C函数:
int cosetCoding(int writtenDataIn, int newData, const int memoryCells, int *cellFailure, int failedCell);
Swig创建.so没问题,我可以将其导入python,但是当我尝试使用以下命令进行访问时:
cosetCoding.cosetCoding(10,11,8,[0,0,0,0,0,0,0,0],0)
我得到以下回溯:
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: in method 'cosetCoding', argument 4 of type 'int *'
该指针应该是一个int数组,其大小由memoryCells定义
如果可以,请使用ctypes。更简单。但是,由于您要求输入SWIG,因此需要的是一个描述如何处理int *的类型图。SWIG不知道可以指向多少个整数。以下摘自SWIG文档中有关多参数typemap的示例:
%typemap(in) (const int memoryCells, int *cellFailure) { int i; if (!PyList_Check($input)) { PyErr_SetString(PyExc_ValueError, "Expecting a list"); return NULL; } $1 = PyList_Size($input); $2 = (int *) malloc(($1)*sizeof(int)); for (i = 0; i < $1; i++) { PyObject *s = PyList_GetItem($input,i); if (!PyInt_Check(s)) { free($2); PyErr_SetString(PyExc_ValueError, "List items must be integers"); return NULL; } $2[i] = PyInt_AsLong(s); } } %typemap(freearg) (const int memoryCells, int *cellFailure) { if ($2) free($2); }
请注意,使用此定义时,从Python调用时,将省略memoryCells参数并仅传递诸如[1,2,3,4]for 的数组cellFailure。类型图将生成memoryCells参数。
memoryCells
[1,2,3,4]
cellFailure
附言:如果您愿意,我可以发布一个完整的示例(适用于Windows)。