Python 如何清除包含对象的PyList对象?

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

我正试图清除一个使用ctypes传递给C函数的Python列表。我在link中找到的调用有时似乎有效,但当我传入的列表包含其他列表或类作为元素时,我会得到一个segfault

我有一个文件foo.py,看起来像这样:

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。

我正要发布这个。。。。我很确定这是正确的答案。我正要发布这个。。。。我很肯定这是正确的答案。