有那个大佬用C写过python扩展,有一些问题请教
本帖最后由 Stubborn 于 2022-12-27 22:48 编辑想用C语言给python写一个扩展
简单的例子一:
我在python中,使用我的扩展函数,可以正常,打印得到13;
from my_method import fir_test_add
print(fir_test_add(8, 5))
对应的C原形是
int test_add(int a, int b)
{
return a + b ;
}
static PyObject*
Test_add(PyObject *self, PyObject *args){
int a,b;
if(!PyArg_ParseTuple(args ,"ii", &a, &b)) {
return NULL;
}
return (PyObject*)Py_BuildValue("i", test_add(a, b));
}
问题来了,如果我的python输入是一个列表长度不定,希望返回的也是一个固定长度的列表。
from fir_method import fir_test_add
print(fir_test_add())
那么我对应的C接口应该怎么编写?
本帖最后由 hrpzcf 于 2022-12-27 23:33 编辑
研究过文档,奈何 C 基础不够扎实看不明白
https://docs.python.org/zh-cn/3.7/c-api/list.html
https://docs.python.org/zh-cn/3.7/c-api/allocation.html#c.PyObject_New
https://docs.python.org/zh-cn/3.7/c-api/memory.html#object-allocators hrpzcf 发表于 2022-12-27 23:17
研究过文档,奈何 C 基础不够扎实看不明白
谢谢,看完了
static PyObject *
Update(PyObject *self, PyObject *args)
{
PyObject *PyList;
PyObject *PyItem;
Py_ssize_t length;
if(!PyArg_ParseTuple(args ,"O!", &PyList_Type, &PyList)) {
PyErr_SetString(PyExc_TypeError, "params must be a List");
return NULL;
}
length = PyList_Size(PyList);
int array;
for (int idx = 0; idx < length; ++idx)
{
PyItem = PyList_GetItem(PyList, idx);
array = PyLong_AsLong(PyItem);
}
int *arr = update_state(array, length);
int val0, val1, val2, val3, val4, val5, val6, val7, val8, val9;
val0 = arr;
val1 = arr;
val2 = arr;
val3 = arr;
val4 = arr;
val5 = arr;
val6 = arr;
val7 = arr;
val8 = arr;
val9 = arr;
return (PyObject*)Py_BuildValue("", val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
}
页:
[1]