使用 Python C API 将 Python 整数列表传递给 C 函数



我在MacOS High Sierra上使用Python3.6 anaconda发行版处理传递给Python C API包装器函数的整数列表时遇到问题。 我想将传入的整数列表转换为可以在 C 中使用的整数数组。

这里有一个类似的问题,使用 Python/C API 将 Python 列表传递给 C 函数,我可以开始工作,但处理整数列表似乎有所不同。

这是我到目前为止所拥有的。

static PyObject * myModule_sumIt(PyObject *self, PyObject *args) {
  PyObject *lst; 
  if(!PyArg_ParseTuple(args, "O", &lst)) {
    Py_DECREF(lst);
    return NULL;
  }
  int n = PyObject_Length(lst);
  printf("nLength of list passed in is %dn", n);
  int nums[n];
  int sum = 0;
  for (int i = 0; i < n; i++) {
     PyLongObject *item = PyList_GetItem(lst, i);
     sum += item;
     printf("ni = %dtitem = %dtsum = %dn", i, item, sum);
     Py_DECREF(item);
  }
  Py_DECREF(lst);
  return Py_BuildValue("i", sum);
}
static PyMethodDef methods[] = {
  { "sum_it", myModule_sumIt, METH_VARARGS, "A Toy Example" },
  { NULL, NULL, 0, NULL }
};
static struct PyModuleDef myModule = {
  PyModuleDef_HEAD_INIT,
  "myModule", 
  "Demo Python wrapper",
  -1,
  methods
};
PyMODINIT_FUNC PyInit_myModule(void) {
  return PyModule_Create(&myModule);
}

这是我在使用distutils构建后在解释器中调用python函数所得到的。

>>> import myModule
>>> myModule.sum_it([1,2,3])
Length of list passed in is 3
i = 0   item = 108078416    sum = 890306742
i = 1   item = 108078448    sum = 890306742
i = 2   item = 108078480    sum = 890306742
-1725230192

请注意,我的预期输出应该是

>>> import myModule
>>> myModule.sum_it([1,2,3])
Length of list passed in is 3
i = 0   item = 1    sum = 1
i = 1   item = 2    sum = 3
i = 2   item = 3    sum = 6
6
sum += item;

item不是 C 长或 int!您必须使用PyLong_AsLong

sum += PyLong_AsLong(item);

(sum应该是long(

相关内容

  • 没有找到相关文章

最新更新