在Python C API中返回多个对象的元组

10 投票
3 回答
8139 浏览
提问于 2025-04-16 02:53

我正在写一个本地函数,它会返回多个Python对象。

PyObject *V = PyList_New(0);
PyObject *E = PyList_New(0);
PyObject *F = PyList_New(0);

return Py_BuildValue("ooo", V, E, F);

这个代码编译得很好,但是当我从Python程序中调用它时,出现了一个错误:

系统错误:传递给Py_BuildValue的格式字符不正确。

我该怎么才能正确地做到这一点呢?

编辑:以下代码可以正常工作。

PyObject *rslt = PyTuple_New(3);
PyTuple_SetItem(rslt, 0, V);
PyTuple_SetItem(rslt, 1, E);
PyTuple_SetItem(rslt, 2, F);
return rslt;

不过,难道没有更简短的方法吗?

3 个回答

-6

使用 Cython

return V, E, F
2

正如Ned Batcheder提到的,Py_BuildValue这个函数需要用大写字母和括号来创建元组。

Py_BuildValue("(OOO)", V, E, F);

另外一个实现相同效果的选项是 PyTuple_Pack

PyTuple_Pack(3, V, E, F);
13

我觉得它想要的是大写的“O”?也就是"OOO",而不是小写的"ooo"

撰写回答