我对Python/C API还不熟悉,虽然我已经成功运行了一些基本函数,但我在这个问题上遇到了困难。
PyObject* sum_elements(PyObject*, PyObject *o)
{
Py_ssize_t n = PyList_Size(o);
long total = 0;
if (n < 0)
{
return PyLong_FromLong(total);
}
PyObject* item;
for (int i = 0; i < n; i++)
{
item = PyList_GetItem(o, i);
if (!PyLong_Check(item)) continue;
total += PyLong_AsLong(item);
}
return PyLong_FromLong(total);
}
基本上这是文档页介绍中的函数。它应该接收一个Python列表,并返回所有元素的总和。如果我传递一个列表,这个函数可以正常工作,但是如果我传递其他类型的值,就会出现错误信息。
SystemError: c:\_work\5\s\objects\listobject.c:187: bad argument to internal function
如果传递的对象不是列表,n就会变成-1,因此应该使用if (n<0)
语句来处理这种情况。
我是这样绑定函数的:
static PyMethodDef example_module_methods[] = {
{ "sum_list", (PyCFunction)sum_elements, METH_O, nullptr},
{ nullptr, nullptr, 0, nullptr }
};
感谢您的选择。
boost::python
,它比纯C-Python桥更容易掌握,除非你只能使用C。 - Radosław Cybulski