python & c-c++单元程序原因段

Posted

技术标签:

【中文标题】python & c-c++单元程序原因段【英文标题】:python & c-c++ unit programme cause Segment 【发布时间】:2019-12-19 11:23:23 【问题描述】:

当我通过 ctypes 为 python 编写 c++ 扩展模型代码时,一切看起来都很好。 永远,最后,python 调用 c++ 函数并返回 PyObject * 得到一个段错误,我猜是 python gc relase c++ 内存。希望各位朋友能给我一个好主意,非常感谢

LID = ctypes.CDLL('./lib/a.out')
LID.cutall_prx.argtypes = [c_char_p]
LID.cutall_prx.restype = py_object
res = LID.cutall_prx('abc')
print res
extern "C" PyObject * cutall_prx(const char *content)
    PyObject *oplist = PyList_New(10 + 1); 
    for(uint32_t j = 0; j < 10; j++)
        PyList_Append(oplist, PyInt_FromLong(j));
       
    return oplist;

print res 导致“分段错误”的地方

【问题讨论】:

【参考方案1】:

来自文档:

注意:如果 len 大于零,则返回的列表对象的项设置为 NULL。因此,在使用 PyList_SetItem() 将所有项目设置为真实对象之前,您不能 [...] 将对象公开给 Python 代码。”

您正在向 Python 提供一个包含 11 个 NULL 指针的列表,后跟 10 个 Long 对象,而不是用值覆盖 NULL 指针。

尝试改用PyList_SetItem

extern "C" PyObject * cutall_prx(const char *content)
    PyObject *oplist = PyList_New(10); 
    for(uint32_t j = 0; j < 10; j++)
        PyList_SetItem(oplist, j, PyInt_FromLong(j));
       
    return oplist;

【讨论】:

以上是关于python & c-c++单元程序原因段的主要内容,如果未能解决你的问题,请参考以下文章

C-C 法混沌时间序列 Matlab与Python代码

Python-调试&单元测试

Python连载22-调试&单元测试

如何让clang忽略c-c++不兼容错误?

实验五 包含多个段的程序

08-蓝图&单元测试