SWIG C至Python Int数组
我正在尝试使用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
参数。
附言:如果您愿意,我可以发布一个完整的示例(适用于Windows)。
以上是 SWIG C至Python Int数组 的全部内容, 来源链接: utcz.com/qa/404339.html