Python 如何清除包含对象的PyList对象?
我正试图清除一个使用ctypes传递给C函数的Python列表。我在link中找到的调用有时似乎有效,但当我传入的列表包含其他列表或类作为元素时,我会得到一个segfault 我有一个文件foo.py,看起来像这样:Python 如何清除包含对象的PyList对象?,python,ctypes,python-c-api,Python,Ctypes,Python C Api,我正试图清除一个使用ctypes传递给C函数的Python列表。我在link中找到的调用有时似乎有效,但当我传入的列表包含其他列表或类作为元素时,我会得到一个segfault 我有一个文件foo.py,看起来像这样: import ctypes _libpractice=ctypes.CDLL('./_practice.so', mode=ctypes.RTLD_GLOBAL) _libpractice.update.argtypes = [ctypes.py_object] _libprac
import ctypes
_libpractice=ctypes.CDLL('./_practice.so', mode=ctypes.RTLD_GLOBAL)
_libpractice.update.argtypes = [ctypes.py_object]
_libpractice.update.restype = ctypes.py_object
def c_update(my_list):
return _libpractice.update(my_list)
#include <Python.h>
#include <stdio.h>
PyObject* update(PyObject* list){
Py_INCREF(list);
Py_ssize_t len = PySequence_Length(list);
PySequence_DelSlice(list, 0, len);
return list;
}
文件practice.c如下所示:
import ctypes
_libpractice=ctypes.CDLL('./_practice.so', mode=ctypes.RTLD_GLOBAL)
_libpractice.update.argtypes = [ctypes.py_object]
_libpractice.update.restype = ctypes.py_object
def c_update(my_list):
return _libpractice.update(my_list)
#include <Python.h>
#include <stdio.h>
PyObject* update(PyObject* list){
Py_INCREF(list);
Py_ssize_t len = PySequence_Length(list);
PySequence_DelSlice(list, 0, len);
return list;
}
以下是segfault的一个示例:
>>> b = [1,2,3,[],5]
>>> foo.c_update(b)
Segmentation fault (core dumped)
我找到了一种解决方法,对列表中的每个项目调用PySequence\u GetItem()
,然后调用PySequence\u DelSlice()
,如下所示:
PyObject* update(PyObject* list){
Py_INCREF(list);
Py_ssize_t len = PySequence_Length(list);
for(Py_ssize_t i = 0; i<len; i++){
PyObject* item = PySequence_GetItem(list,i);
}
PySequence_DelSlice(list, 0, len);
return list;
}
如何在确保正确处理引用计数的同时清除传入的列表?我不知道这是否是SEGFULT的直接原因,但您不能从作为CDLL加载的库中使用Python API。您必须使用PyDLL。有了CDLL,Python将在从该库调用函数之前释放GIL,您需要GIL。我不知道这是否是SEGFULT的直接原因,但您不能从作为CDLL加载的库中使用Python API。您必须使用PyDLL。有了CDLL,Python将在从该库调用函数之前释放GIL,而您需要GIL。我正要发布这个。。。。我很确定这是正确的答案。我正要发布这个。。。。我很肯定这是正确的答案。