最终将新的PyObject *从C ++返回到Python的段错误

时间:2019-01-18 11:19:15

标签: python c++ python-2.7 python-c-api

我正在编写库的C ++和Python端,该库将用C ++编写的软件中的某些功能公开给Python脚本。我正在将一些感兴趣的源文件和一个如下所示的包装器文件编译到共享库中,并使用ctypes加载该库。

extern "C" {
    PyObject *py_get_cxx_set_EXAMPLE(void)
    {
        std::set<long> cset = get_cxx_set_for_python();
        PyGILState_STATE gstate = PyGILState_Ensure();
        PyObject *pyset = PySet_New(NULL);
        for (long c_long: cset)
            PySet_Add(pyset, PyLong_FromLong(c_long));
        PyGILState_Release(gstate);
        return pyset;
    }
}

在python端:

example_lib.py_get_cxx_set_EXAMPLE.restype = ctypes.py_object
for i in range(0, 1000):
    ret = example_lib.py_get_cxx_set_EXAMPLE()

我发现前几次调用将成功,但是C ++代码将在循环中间进行段错误。在GDB上,我会发现调用栈的结尾是这样的:

#0  0x000055555563244a in PyErr_Occurred ()
#1  0x000055555562a387 in _PyObject_GC_Malloc ()
#2  0x0000555555629ebd in _PyObject_GC_New ()
#3  0x000055555562b23c in PyDict_New ()
#4  0x00007ffff66df9be in python::to_python_object<db::pmbus_diagnostics> (t=...) at python_wrapper/python.hpp:101

Python运行时似乎拒绝为我制作更多Python对象(在这种情况下为dict)...!

在C ++代码中我做了什么错事?

编辑:: 已更新,请参见答案

1 个答案:

答案 0 :(得分:0)

好的,我忘记添加代码来获取和释放某些函数类的全局解释器锁。很抱歉这个愚蠢的问题。

对Python的孩子有信心。