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

回到顶部