编写Python C扩展:如何正确加载PyListObject?

时间:2011-02-22 14:45:48

标签: python python-c-extension

在尝试读取填充了浮点数的Python列表并使用它们的值填充real channels[7]时(我正在使用F2C,所以real只是float的typedef),我能够从中检索所有是零值。你能指出下面代码中的错误吗?

static PyObject *orbital_spectra(PyObject *self, PyObject *args) {
  PyListObject *input = (PyListObject*)PyList_New(0);
  real channels[7], coefficients[7], values[240];
  int i;

  if (!PyArg_ParseTuple(args, "O!", &PyList_Type, &input)) {
    return NULL;
  }
  for (i = 0; i < PyList_Size(input); i++) {
    printf("%f\n", PyList_GetItem(input, (Py_ssize_t)i)); // <--- Prints zeros
  }
//....
}

2 个答案:

答案 0 :(得分:3)

PyList_GetItem将返回PyObject*。您需要将其转换为C理解的数字。尝试将代码更改为:

printf("%f\n", PyFloat_AsDouble(PyList_GetItem(input, (Py_ssize_t)i)));

答案 1 :(得分:2)

我在这段代码中看到的一些东西。

  1. 泄漏引用,不要在开头创建那个空列表,不需要它。
  2. 您无需转发PyListObject
  3. PyList_GetItem返回PyObject,而不是浮点数。使用PyFloat_AsDouble提取值。
  4. 如果PyList_GetItem返回NULL,则会抛出异常,您应该检查它。