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

时间:2018-01-18 18:47:27

标签: python c c-api

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

这里有一个类似的问题https://3v4l.org/tTALQ,我可以开始工作,但处理一个整体列表似乎是不同的。

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

<?php
// define expected GET parameters
$params = ['f', 'folder', 'type', 'desc', 'dim', 'id'];

// loop over parameters in order to build path: /imagenes/foods/salads/green_50/23.png
$path = null;
foreach ($params as $key => $param) {
    if (isset($_GET[$param])) {
        $path .= ($param == 'dim' ? '_' : '/').basename($_GET[$param]);
        unset($params[$key]);
    }
}
$path .= '.png';

// check all params were passed
if (!empty($params)) {
    die('Invalid request');
}

// check file exists
if (!file_exists($path)) {
    die('File does not exist');
}

// check file is image
if (!getimagesize($path)) {
    die('Invalid image');
}

// all good serve file
header("Content-Type: image/png");
header('Content-Length: '.filesize($path));

readfile($path);

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

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 %d\n", n);

  int nums[n];
  int sum = 0;
  for (int i = 0; i < n; i++) {
     PyLongObject *item = PyList_GetItem(lst, i);
     sum += item;
     printf("\ni = %d\titem = %d\tsum = %d\n", 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);
}

请注意,我的预期输出应为

>>> 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

1 个答案:

答案 0 :(得分:5)

sum += item;

item 是C long还是int!您必须使用PyLong_AsLong

sum += PyLong_AsLong(item);

(而sum应该是long